log4j 2 writing

Post on 11-May-2015

846 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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日日曜日

top related