Log4j 2 writing
Transcript of Log4j 2 writing
![Page 1: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/1.jpg)
Log4Jソースコードリーディング
2012.10.06 (sat) at PLUGRAM, Inc.
ライティング
12年10月7日日曜日
![Page 2: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/2.jpg)
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
Log4Jライティング
今日やりたいこと
ログレベルでフィルタリングしたい
12年10月7日日曜日
![Page 3: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/3.jpg)
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
Log4Jライティング
まずは 前回のおさらい
12年10月7日日曜日
![Page 4: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/4.jpg)
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
Log4J 2
http://logging.apache.org/log4j/2.x/manual/architecture.html
12年10月7日日曜日
![Page 5: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/5.jpg)
社内勉強会 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年10月7日日曜日
![Page 6: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/6.jpg)
社内勉強会 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年10月7日日曜日
![Page 7: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/7.jpg)
社内勉強会 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年10月7日日曜日
![Page 8: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/8.jpg)
社内勉強会 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年10月7日日曜日
![Page 9: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/9.jpg)
社内勉強会 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
ログ出力までの流れ
org.apache.logging.log4j.core.Logger$PrivateConfig
12年10月7日日曜日
![Page 10: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/10.jpg)
社内勉強会 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年10月7日日曜日
![Page 11: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/11.jpg)
社内勉強会 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年10月7日日曜日
![Page 12: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/12.jpg)
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
主な登場人物LogManagerLogger
LogContextConfiguration
とゆかいな仲間たち(関連クラス)AbstractLogger は Logger の親クラス
LoggerConfig は Logger の処理を委譲してる
12年10月7日日曜日
![Page 13: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/13.jpg)
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
LoggerContext
・起動ポイント・設定とかロガーとか持ってる
private volatile Configuration config = new DefaultConfiguration();
private final ConcurrentMap<String, Logger> loggers = new ConcurrentHashMap<String, Logger>();
12年10月7日日曜日
![Page 14: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/14.jpg)
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
LogManager
・こいつが持ってるFactory経由でLoggerを呼び出す
private static final String LOGGER_CONTEXT_FACTORY = "LoggerContextFactory";
クラス名から設定できるようにしておけばデフォルトのFactoryクラスも変えられる
12年10月7日日曜日
![Page 15: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/15.jpg)
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
Configuration
・Logger(LoggerConfig)、Appenderを持ってる・あとはプラグインとかリスナーとか
Configurationクラスはインターフェースなので
BaseConfigurationクラスを参考に・・・→自分でConfiguration作るときはこれを拡張すればよい
12年10月7日日曜日
![Page 16: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/16.jpg)
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
Logger
・このクラス経由でログ出力を行う 実際の処理はLoggerConfigに委譲
12年10月7日日曜日
![Page 17: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/17.jpg)
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
今日やりたいこと
ログレベルでフィルタリングしたい
12年10月7日日曜日
![Page 18: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/18.jpg)
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
ログレベルでフィルタリング
/** * Call the appender. * @param event The event to process. */ public void callAppender(LogEvent event) { ・・・ if (level != null) { if (intLevel < event.getLevel().intLevel()) { return; } } ・・・ try { ・・・
try { appender.append(event); } catch (RuntimeException ex) { ・・・ } } }
org.apache.logging.log4j.core.config.AppenderControl
12年10月7日日曜日
![Page 19: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/19.jpg)
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
ログレベルでフィルタリング
/** * Add an Appender to the LoggerConfig. * @param appender The Appender to add. * @param level The Level to use. * @param filter A Filter for the Appender reference. */ public void addAppender(Appender appender, Level level, Filter filter) { appenders.put(appender.getName(), new AppenderControl(appender, level, filter)); }
org.apache.logging.log4j.core.config.LoggerConfig
12年10月7日日曜日
![Page 20: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/20.jpg)
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
書くときの注意・どういった意図を持ってクラス設計を行っているか →各クラスの責務はなにか →パッケージ分けのルール →どこからPlugin化しているか
・JDK5で入ったjava.util.concurrentを使っているところ →なぜそのクラスを使っているか
→ synchronizedやvolatileとはどう違う?
12年10月7日日曜日
![Page 21: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/21.jpg)
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
書くときの注意・テストも書こう →TDD(テスト駆動開発)で書いてみよう →Mockライブラリ使おう →Eclipse使ってるならQuick JUnit Plugin
・必要なライブラリはMaven(Gradle)で管理してね → 使い方は説明します
→ Jenkins使ってたら連携してもいいよ
12年10月7日日曜日
![Page 22: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/22.jpg)
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
書くときの注意
・書いたコードはGitHubにアップすること →Gitは常識レベルとして知っておくと便利 →他の人のコードでバグなどがあったらissue登録 →いきなりプルリクエストしてもおk
12年10月7日日曜日
![Page 23: Log4j 2 writing](https://reader034.fdocument.pub/reader034/viewer/2022050906/554f91c6b4c9052a518b53f2/html5/thumbnails/23.jpg)
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
ありがとうございました
12年10月7日日曜日