Log4j 2 source code reading
- 2. 社内勉強会 Log4J
Log4J
ログ出力 専用ライブラリ
何ができるの?
・パッケージでフィルタリング
・ログレベルでフィルタリング
・ログ出力先をカスタマイズ
・ログ出力レイアウトをカスタマイズ
COPYRIGHT 2012 PLUGRAM, Inc.
12年9月23日日曜日
- 3. 社内勉強会 Log4J
つかいかた
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.");
}
}
COPYRIGHT 2012 PLUGRAM, Inc.
12年9月23日日曜日
- 4. 社内勉強会 Log4J
つかいかた
<?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>
COPYRIGHT 2012 PLUGRAM, Inc.
12年9月23日日曜日
- 5. 社内勉強会 Log4J
Log4J 2
http://logging.apache.org/log4j/2.x/manual/architecture.html
COPYRIGHT 2012 PLUGRAM, Inc.
12年9月23日日曜日
- 6. 社内勉強会 Log4J
ログ出力までの流れ
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.");
}
}
COPYRIGHT 2012 PLUGRAM, Inc.
12年9月23日日曜日
- 7. 社内勉強会 Log4J
ログ出力までの流れ
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) {
LogManager new Main().run();
}
public static Logger getLogger(String name) {
return factory.getContext(LogManager.class.getName(), null, false).getLogger(name);
public void run() {
}
logger.trace("Entering application.");
MyNewApp bar = new MyNewApp();
if (bar.doIt()) {
org.apache.logging.log4j.core.LoggerContext
logger.error("Just do it.");
}
logger.trace("Exiting application."); org.apache.logging.log4j.core.Logger
}
}
COPYRIGHT 2012 PLUGRAM, Inc.
12年9月23日日曜日
- 8. 社内勉強会 Log4J
ログ出力までの流れ
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.");
}
}
COPYRIGHT 2012 PLUGRAM, Inc.
12年9月23日日曜日
- 9. 社内勉強会 Log4J
ログ出力までの流れ
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();
AbstractLogger
if (bar.doIt()) {
logger.error("Just do it.");
public void trace(String message) {
}
if (isEnabled(Level.TRACE, null, message)) {
logger.trace("Exiting application.");
log(null, FQCN, Level.TRACE, new SimpleMessage(message), null);
}
}
}
}
COPYRIGHT 2012 PLUGRAM, Inc.
12年9月23日日曜日
- 10. 社内勉強会 Log4J
ログ出力までの流れ
AbstractLogger
public void trace(String message) {
if (isEnabled(Level.TRACE, null, message)) {
log(null, FQCN, Level.TRACE, new SimpleMessage(message), null);
}
}
core.Logger
@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);
}
COPYRIGHT 2012 PLUGRAM, Inc.
12年9月23日日曜日
- 11. 社内勉強会 Log4J
ログ出力までの流れ
core.Logger
@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.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);
}
COPYRIGHT 2012 PLUGRAM, Inc.
12年9月23日日曜日
- 12. 社内勉強会 Log4J
ログ出力までの流れ
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();
}
}
}
}
}
COPYRIGHT 2012 PLUGRAM, Inc.
12年9月23日日曜日
- 13. 社内勉強会 Log4J
読んでみよう
・出力レイアウトの設定方法
・出力先の設定方法
・パッケージ名でのフィルタリング
・ログレベルでのフィルタリング
COPYRIGHT 2012 PLUGRAM, Inc.
12年9月23日日曜日
- 14. 社内勉強会 Log4J
出力レイアウトの設定方法
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);
}
COPYRIGHT 2012 PLUGRAM, Inc.
12年9月23日日曜日
- 15. 社内勉強会 Log4J
出力レイアウトの設定方法
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();
}
COPYRIGHT 2012 PLUGRAM, Inc.
12年9月23日日曜日
- 16. 社内勉強会 Log4J
出力レイアウトの設定方法(利用してるところ)
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 {
core.layout.PatternLayout
readLock.unlock();
}
} public String formatAs(final LogEvent event) {
StringBuilder buf = new StringBuilder();
for (PatternFormatter formatter : formatters) {
formatter.format(event, buf);
}
core.layout.AbstractStringLayout String str = buf.toString();
if (replace != null) {
str = replace.format(str);
public byte[] format(LogEvent event) { }
return encoder.getBytes(formatAs(event)); return config == null ? str : config.getSubst().replace(event, str);
} }
COPYRIGHT 2012 PLUGRAM, Inc.
12年9月23日日曜日
- 17. 社内勉強会 Log4J
読んでみよう
・出力レイアウトの設定方法
同じように読んでみよう
・出力先の設定方法
・パッケージ名でのフィルタリング
・ログレベルでのフィルタリング
COPYRIGHT 2012 PLUGRAM, Inc.
12年9月23日日曜日
- 18. 社内勉強会 Log4J
ありがとうございました
COPYRIGHT 2012 PLUGRAM, Inc.
12年9月23日日曜日