log4j 2 writing
TRANSCRIPT
Log4Jソースコードリーディング
2012.10.06 (sat) at PLUGRAM, Inc.
ライティング
12年10月7日日曜日
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
Log4Jライティング
今日やりたいこと
ログレベルでフィルタリングしたい
12年10月7日日曜日
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
Log4Jライティング
まずは 前回のおさらい
12年10月7日日曜日
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
Log4J 2
http://logging.apache.org/log4j/2.x/manual/architecture.html
12年10月7日日曜日
社内勉強会 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日日曜日
社内勉強会 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日日曜日
社内勉強会 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日日曜日
社内勉強会 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日日曜日
社内勉強会 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日日曜日
社内勉強会 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日日曜日
社内勉強会 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日日曜日
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
主な登場人物LogManagerLogger
LogContextConfiguration
とゆかいな仲間たち(関連クラス)AbstractLogger は Logger の親クラス
LoggerConfig は Logger の処理を委譲してる
12年10月7日日曜日
社内勉強会 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日日曜日
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
LogManager
・こいつが持ってるFactory経由でLoggerを呼び出す
private static final String LOGGER_CONTEXT_FACTORY = "LoggerContextFactory";
クラス名から設定できるようにしておけばデフォルトのFactoryクラスも変えられる
12年10月7日日曜日
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
Configuration
・Logger(LoggerConfig)、Appenderを持ってる・あとはプラグインとかリスナーとか
Configurationクラスはインターフェースなので
BaseConfigurationクラスを参考に・・・→自分でConfiguration作るときはこれを拡張すればよい
12年10月7日日曜日
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
Logger
・このクラス経由でログ出力を行う 実際の処理はLoggerConfigに委譲
12年10月7日日曜日
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
今日やりたいこと
ログレベルでフィルタリングしたい
12年10月7日日曜日
社内勉強会 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日日曜日
社内勉強会 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日日曜日
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
書くときの注意・どういった意図を持ってクラス設計を行っているか →各クラスの責務はなにか →パッケージ分けのルール →どこからPlugin化しているか
・JDK5で入ったjava.util.concurrentを使っているところ →なぜそのクラスを使っているか
→ synchronizedやvolatileとはどう違う?
12年10月7日日曜日
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
書くときの注意・テストも書こう →TDD(テスト駆動開発)で書いてみよう →Mockライブラリ使おう →Eclipse使ってるならQuick JUnit Plugin
・必要なライブラリはMaven(Gradle)で管理してね → 使い方は説明します
→ Jenkins使ってたら連携してもいいよ
12年10月7日日曜日
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
書くときの注意
・書いたコードはGitHubにアップすること →Gitは常識レベルとして知っておくと便利 →他の人のコードでバグなどがあったらissue登録 →いきなりプルリクエストしてもおk
12年10月7日日曜日
社内勉強会 Log4J
COPYRIGHT 2012 PLUGRAM, Inc.
ありがとうございました
12年10月7日日曜日