出力範囲と出力レベルを設定できます。
出力先を指定できます。マニュアルを見ると、
出力情報とレイアウトをカスタマイズ
クラスパスの順番とか、クラスパスが通ってないとかそんなことに悩まされる必要がなくなるので指定するのがお勧め。初期化の段階で以下のコードを入れておく
PropertyConfigurator.configure(propertyFileName)
java -Dlog4j.configuration=file:///home/foo/log4j.properties 実行クラス
バッチ処理でDEBUGログはコンソールに出す必要がないがシステムエラー系はコンソールに出しておきたいケースがあった。探しても探しても見つからなく、挫折しかけた頃にようやく見つけた。Thresholdパラメータがポイント
log4j.rootCategory=DEBUG,FILE,STDOUT # log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.Threshold=DEBUG log4j.appender.FILE.File=debug.log log4j.appender.FILE.Append=true log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=%d %c %m%n # log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender log4j.appender.STDOUT.Threshold=INFO log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout log4j.appender.STDOUT.layout.ConversionPattern=%c %m%n
暗号みたいなレイアウトの記号を解説
記号 | 解説 | 表示例 |
%r | 経過時間をミリ秒で表示 | 123 |
%p | DEBUGやFATALなどの優先度 | DEBUG |
%t | スレッド名 | main |
%c | カテゴリー名 | |
%m | アプリケーションログメッセージ | これを出力しなかったら意味ない |
%n | 改行コード | 普通は文末に入れる |
%C | 実際にログ出力されているクラス名。パフォーマンスが落ちるから運用時はNG | test.MyLogger |
%M | 出力メソッド名。こちらもパフォーマンス低下 | somemethod |
%F | 出力javaファイル名 | hoge.java |
%L | 実行行数 | 100 |
このままだと出力文字列の長さがまちまちになるのでフォーマットをかますのが一般的。最初からフォーマットをいれてしまうとまさに暗号なので、まずは上記レイアウト項目が出力されるのを確認してからフォーマットの設定を入れるのがよい。
Thresholdを使う。
log4j.appender.STDOUT.Threshold=INFO
ファイルに書き込む時は同時書き込みでファイルを壊さないようにロック待ちが発生する。数百人が同時にアクセスするようなシステムではパフォーマンスに大きな影響が出る可能性があるのでログ設計は慎重にやる必要がある。なんでもdebug出力はよろしくない。