log4j 2 source code reading

Post on 11-May-2015

1.113 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Log4Jソースコードリーディング2012.09.22 (sat) at PLUGRAM, Inc.

12年9月23日日曜日

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

Log4J

“ログ出力”専用ライブラリ

何ができるの?・パッケージでフィルタリング

・ログレベルでフィルタリング

・ログ出力先をカスタマイズ

・ログ出力レイアウトをカスタマイズ

12年9月23日日曜日

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

つかいかたpackage com.plugram.log4j.foo;

import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;

import com.plugram.log4j.bar.MyNewApp;

public class Main {

static Logger logger = LogManager.getLogger(Main.class.getName());

public static void main(String[] args) { new Main().run(); }

public void run() { logger.trace("Entering application."); MyNewApp app = new MyNewApp(); if (app.doIt()) { logger.error("Just do it."); } logger.trace("Exiting application."); }

}

12年9月23日日曜日

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

つかいかた<?xml version="1.0" encoding="UTF-8"?><configuration status="off"> <appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </appenders> <loggers> <!-- <logger name="com.plugram.log4j.foo" level="error"> <appender-ref ref="Console"/> </logger> <logger name="com.plugram.log4j.bar" level="error"> <appender-ref ref="Console"/> </logger> --> <root level="trace"> <appender-ref ref="Console"/> </root> </loggers></configuration>

パッケージ名でフィルタリング

ログレベルでフィルタリング

出力レイアウト出力先

12年9月23日日曜日

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

Log4J 2

http://logging.apache.org/log4j/2.x/manual/architecture.html

12年9月23日日曜日

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

ログ出力までの流れ

package com.plugram.log4j.foo;

import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;

import com.plugram.log4j.bar.MyNewApp;

public class Main {

static Logger logger = LogManager.getLogger(Main.class.getName());

public static void main(String[] args) { new Main().run(); }

public void run() { logger.trace("Entering application."); MyNewApp bar = new MyNewApp(); if (bar.doIt()) { logger.error("Just do it."); } logger.trace("Exiting application."); }

}

12年9月23日日曜日

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

package com.plugram.log4j.foo;

import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;

import com.plugram.log4j.bar.MyNewApp;

public class Main {

static Logger logger = LogManager.getLogger(Main.class.getName());

public static void main(String[] args) { new Main().run(); }

public void run() { logger.trace("Entering application."); MyNewApp bar = new MyNewApp(); if (bar.doIt()) { logger.error("Just do it."); } logger.trace("Exiting application."); }

}

public static Logger getLogger(String name) { return factory.getContext(LogManager.class.getName(), null, false).getLogger(name);}

LogManager

org.apache.logging.log4j.core.LoggerContext

org.apache.logging.log4j.core.Logger

ログ出力までの流れ

12年9月23日日曜日

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

package com.plugram.log4j.foo;

import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;

import com.plugram.log4j.bar.MyNewApp;

public class Main {

static Logger logger = LogManager.getLogger(Main.class.getName());

public static void main(String[] args) { new Main().run(); }

public void run() { logger.trace("Entering application."); MyNewApp bar = new MyNewApp(); if (bar.doIt()) { logger.error("Just do it."); } logger.trace("Exiting application."); }

}

ログ出力までの流れ

12年9月23日日曜日

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

package com.plugram.log4j.foo;

import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;

import com.plugram.log4j.bar.MyNewApp;

public class Main {

static Logger logger = LogManager.getLogger(Main.class.getName());

public static void main(String[] args) { new Main().run(); }

public void run() { logger.trace("Entering application."); MyNewApp bar = new MyNewApp(); if (bar.doIt()) { logger.error("Just do it."); } logger.trace("Exiting application."); }

}

public void trace(String message) { if (isEnabled(Level.TRACE, null, message)) { log(null, FQCN, Level.TRACE, new SimpleMessage(message), null); }}

AbstractLogger

ログ出力までの流れ

12年9月23日日曜日

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

public void trace(String message) { if (isEnabled(Level.TRACE, null, message)) { log(null, FQCN, Level.TRACE, new SimpleMessage(message), null); }}

AbstractLogger

@Override public void log(Marker marker, String fqcn, Level level, Message data, Throwable t) { if (data == null) { data = new SimpleMessage(""); } config.config.getConfigurationMonitor().checkConfiguration(); config.loggerConfig.log(name, marker, fqcn, level, data, t); }

core.Logger

ログ出力までの流れ

12年9月23日日曜日

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

@Override public void log(Marker marker, String fqcn, Level level, Message data, Throwable t) { if (data == null) { data = new SimpleMessage(""); } config.config.getConfigurationMonitor().checkConfiguration(); config.loggerConfig.log(name, marker, fqcn, level, data, t); }

core.Logger

ログ出力までの流れ

core.LoggerConfig

public void log(String loggerName, Marker marker, String fqcn, Level level, Message data, Throwable t) { LogEvent event = logEventFactory.createEvent(loggerName, marker, fqcn, level, data, t); log(event); }

12年9月23日日曜日

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

ログ出力までの流れ

core.LoggerConfig

public void log(LogEvent event) {

counter.incrementAndGet(); try { if (isFiltered(event)) { return; }

callAppenders(event);

if (additive && parent != null) { parent.log(event); } } finally { if (counter.decrementAndGet() == 0) { synchronized (this) { if (shutdown) { notifyAll(); } }

} } }

12年9月23日日曜日

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

読んでみよう

・出力レイアウトの設定方法

・出力先の設定方法

・パッケージ名でのフィルタリング

・ログレベルでのフィルタリング

12年9月23日日曜日

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

出力レイアウトの設定方法

core.LoggerContext

private volatile Configuration config = new DefaultConfiguration();

core.DefaultConfiguration

public DefaultConfiguration() {

setName(DEFAULT_NAME); Layout layout = PatternLayout.createLayout("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n", null, null, null); Appender appender = ConsoleAppender.createAppender(layout, null, "SYSTEM_OUT", "Console", "true"); addAppender(appender); LoggerConfig root = getRootLogger(); root.addAppender(appender, null, null);

String l = System.getProperty(DEFAULT_LEVEL); Level level = (l != null && Level.valueOf(l) != null) ? Level.valueOf(l) : Level.ERROR; root.setLevel(level); }

12年9月23日日曜日

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

出力レイアウトの設定方法core.layout.PatternLayout @PluginFactory public static PatternLayout createLayout(@PluginAttr("pattern") String pattern, @PluginConfiguration Configuration config, @PluginElement("replace") RegexReplacement replace, @PluginAttr("charset") String charset) { Charset c = Charset.isSupported("UTF-8") ? Charset.forName("UTF-8") : Charset.defaultCharset(); if (charset != null) { if (Charset.isSupported(charset)) { c = Charset.forName(charset); } else { LOGGER.error("Charset " + charset + " is not supported for layout, using " + c.displayName()); } } return new PatternLayout(config, replace, pattern == null ? DEFAULT_CONVERSION_PATTERN : pattern, c); }

private PatternLayout(Configuration config, final RegexReplacement replace, final String pattern, final Charset charset) { super(charset); this.replace = replace; this.conversionPattern = pattern; this.config = config; PatternParser parser = createPatternParser(config); formatters = parser.parse((pattern == null) ? DEFAULT_CONVERSION_PATTERN : pattern); handlesExceptions = parser.handlesExceptions(); }

12年9月23日日曜日

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

出力レイアウトの設定方法(利用してるところ)

core.appender.OutputStreamAppender

public void append(LogEvent event) { readLock.lock(); try { manager.write(getLayout().format(event)); if (this.immediateFlush) { manager.flush(); } } catch (AppenderRuntimeException ex) { error("Unable to write to stream " + manager.getName() + " for appender " + getName()); throw ex; } finally { readLock.unlock(); } }

public byte[] format(LogEvent event) { return encoder.getBytes(formatAs(event)); }

core.layout.AbstractStringLayout

core.layout.PatternLayout

public String formatAs(final LogEvent event) { StringBuilder buf = new StringBuilder(); for (PatternFormatter formatter : formatters) { formatter.format(event, buf); } String str = buf.toString(); if (replace != null) { str = replace.format(str); } return config == null ? str : config.getSubst().replace(event, str); }

12年9月23日日曜日

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

読んでみよう

・出力レイアウトの設定方法

・出力先の設定方法

・パッケージ名でのフィルタリング

・ログレベルでのフィルタリング

同じように読んでみよう

12年9月23日日曜日

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

ありがとうございました

12年9月23日日曜日

top related