log4j 2 source code reading

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

Upload: go-tanaka

Post on 11-May-2015

1.113 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Log4j 2 source code reading

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

12年9月23日日曜日

Page 2: Log4j 2 source code reading

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

Log4J

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

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

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

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

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

12年9月23日日曜日

Page 3: Log4j 2 source code reading

社内勉強会 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日日曜日

Page 4: Log4j 2 source code reading

社内勉強会 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日日曜日

Page 5: Log4j 2 source code reading

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

Log4J 2

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

12年9月23日日曜日

Page 6: Log4j 2 source code reading

社内勉強会 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日日曜日

Page 7: Log4j 2 source code reading

社内勉強会 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日日曜日

Page 8: Log4j 2 source code reading

社内勉強会 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日日曜日

Page 9: Log4j 2 source code reading

社内勉強会 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日日曜日

Page 10: Log4j 2 source code reading

社内勉強会 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日日曜日

Page 11: Log4j 2 source code reading

社内勉強会 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日日曜日

Page 12: Log4j 2 source code reading

社内勉強会 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日日曜日

Page 13: Log4j 2 source code reading

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

読んでみよう

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

・出力先の設定方法

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

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

12年9月23日日曜日

Page 14: Log4j 2 source code reading

社内勉強会 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日日曜日

Page 15: Log4j 2 source code reading

社内勉強会 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日日曜日

Page 16: Log4j 2 source code reading

社内勉強会 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日日曜日

Page 17: Log4j 2 source code reading

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

読んでみよう

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

・出力先の設定方法

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

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

同じように読んでみよう

12年9月23日日曜日

Page 18: Log4j 2 source code reading

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

ありがとうございました

12年9月23日日曜日