log4j 2 source code reading
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日日曜日