log4j 2 writing

23
Log4Jソースコードリーディング 2012.10.06 (sat) at PLUGRAM, Inc. ライティング 12107日日曜日

Upload: go-tanaka

Post on 11-May-2015

846 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Log4j 2 writing

Log4Jソースコードリーディング

2012.10.06 (sat) at PLUGRAM, Inc.

ライティング

12年10月7日日曜日

Page 2: Log4j 2 writing

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

Log4Jライティング

今日やりたいこと

ログレベルでフィルタリングしたい

12年10月7日日曜日

Page 3: Log4j 2 writing

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

Log4Jライティング

まずは 前回のおさらい

12年10月7日日曜日

Page 4: Log4j 2 writing

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

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

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

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

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

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

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

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

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

主な登場人物LogManagerLogger

LogContextConfiguration

とゆかいな仲間たち(関連クラス)AbstractLogger は Logger の親クラス

LoggerConfig は Logger の処理を委譲してる

12年10月7日日曜日

Page 13: Log4j 2 writing

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

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

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

Configuration

・Logger(LoggerConfig)、Appenderを持ってる・あとはプラグインとかリスナーとか

Configurationクラスはインターフェースなので

BaseConfigurationクラスを参考に・・・→自分でConfiguration作るときはこれを拡張すればよい

12年10月7日日曜日

Page 16: Log4j 2 writing

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

Logger

・このクラス経由でログ出力を行う 実際の処理はLoggerConfigに委譲

12年10月7日日曜日

Page 17: Log4j 2 writing

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

今日やりたいこと

ログレベルでフィルタリングしたい

12年10月7日日曜日

Page 18: Log4j 2 writing

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

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

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

書くときの注意・どういった意図を持ってクラス設計を行っているか →各クラスの責務はなにか →パッケージ分けのルール →どこからPlugin化しているか

・JDK5で入ったjava.util.concurrentを使っているところ →なぜそのクラスを使っているか

 → synchronizedやvolatileとはどう違う?

12年10月7日日曜日

Page 21: Log4j 2 writing

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

書くときの注意・テストも書こう →TDD(テスト駆動開発)で書いてみよう →Mockライブラリ使おう →Eclipse使ってるならQuick JUnit Plugin

・必要なライブラリはMaven(Gradle)で管理してね → 使い方は説明します

 → Jenkins使ってたら連携してもいいよ

12年10月7日日曜日

Page 22: Log4j 2 writing

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

書くときの注意

・書いたコードはGitHubにアップすること →Gitは常識レベルとして知っておくと便利 →他の人のコードでバグなどがあったらissue登録 →いきなりプルリクエストしてもおk

12年10月7日日曜日

Page 23: Log4j 2 writing

社内勉強会 Log4J

COPYRIGHT 2012 PLUGRAM, Inc.

ありがとうございました

12年10月7日日曜日