SLF4J+log4jをeclipseで使う

eclipseにて、Consoleとファイルにログを出力できるところまで環境を整えます。
ここを参考にしました。
http://netbuffalo.doorblog.jp/archives/4466209.html

予備知識

log4jjavaで最もポピュラーなロギングフレームワークだと思います。
log4jだけでも良いのですが、SLF4Jを使うことでprintfライクな文法でログを出力できるところが気に入り利用することにしました。

{}を変換指定子として printf ライクにメッセージを出力します。

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

log4jをインストール

eclipseに標準で入っているのか?WTPプラグインあたりをインストールしたときに入ったのか?分かりませんが、
既にpluginsフォルダにインストール済みでした。
C:\eclipse\plugins\org.apache.log4j_1.2.15.v201012070815.jar
を使います。

プロジェクト>右クリック>ビルドパスの構成>外部Jarの追加で上記のjarを追加します。

slf4jをインストール

http://www.slf4j.org/dist/slf4j-1.7.7.zip
をダウンロードし展開します。
そのうち
slf4j-log4j12-1.7.7.jar
slf4j-simple-1.7.7.jar
slf4j-api-1.7.7.jar
を c:\eclipse\pluginsにコピーします。

以上の3つを
プロジェクト>右クリック>ビルドパスの構成>外部Jarの追加にて追加します。

なお、slf4j-log4j12-1.7.7.jarはlog4jマッパーなんですが、
log4jのversion1.2に対応しています。eclipseに同梱していたorg.apache.log4j_1.2.15.v201012070815.jar
もversion1.2なんでOKですね。

log4j.xmlで設定する

log4j.propertiesはini形式でより普及している記述法ですが、今回はxmlで記述してみます。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >

  <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
     <param name="Target" value="System.out" /> 
     <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %5p %c{1} %m%n" />
     </layout>
  </appender>

  <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
     <param name="File" value="c:/logs/myprj.log" />
     <param name="Append" value="true" />
     <param name="MaxFileSize" value="5MB" /> 
     <param name="MaxBackupIndex" value="5" />
     <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %5p %c{1} %m%n" />
     </layout>
  </appender>
  
  <root>
    <priority value ="DEBUG" />
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="FILE"/>
  </root>
  
</log4j:configuration>

プロジェクト>右クリック>新規>フォルダでresourceフォルダを作成します
resourceフォルダにlog4j.xmlという名前で、上記内容を保存します。
プロジェクト>右クリック>ビルドパス構成>クラスフォルダの追加でresourceフォルダを追加します。

これでlog4j.xmlが読み込まれます。

コード

サンプルコードがあれば一目瞭然でしょう。
log4jをimportするのではなくslf4jをimportすることが重要です。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyApp {
	private static Logger log = LoggerFactory.getLogger(MyApp.class);
	public static void main(String[] args) {
		log.info("Starting my application...");
	}
}

projectを実行する

log4jへのBindはわざわざコーディングする必要はなく、ビルドパスにslf4j-log4j12-1.7.7.jar指定されているだけでBindされます。
よってプログラムを実行すると、consoleに以下のように出力されるはずです

SLF4J: Found binding in [jar:file:/C:/eclipse/plugins/slf4j-log4j12-1.7.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/eclipse/plugins/slf4j-simple-1.7.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]

さらにlogの出力コードに到達すれば、ConsoleとFileに以下が出力されます

Starting my application...

以上です