#author("2019-08-08T12:19:06+00:00","default:wikiadmin","wikiadmin") -JDK標準のロギングよりはるかに使われているライブラリ #contents *インストール [#m6ad796d] *Log4jを理解する3つのキーワード [#j2dec6ad] -Categories 出力範囲と出力レベルを設定できます。 -Appenders 出力先を指定できます。マニュアルを見ると、 -Layouts 出力情報とレイアウトをカスタマイズ *設定ファイル [#a1a9e8bf] **設定ファイルの場所を指定する [#q3cb74a1] クラスパスの順番とか、クラスパスが通ってないとかそんなことに悩まされる必要がなくなるので指定するのがお勧め。初期化の段階で以下のコードを入れておく PropertyConfigurator.configure(propertyFileName) -起動オプションで設定するやり方もある java -Dlog4j.configuration=file:///home/foo/log4j.properties 実行クラス **DEBUGレベルと、ERROR以上でログを分ける [#z5a23236] バッチ処理で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 **レイアウト [#h8b03188] 暗号みたいなレイアウトの記号を解説 |記号|解説|表示例| |%r|経過時間をミリ秒で表示|123| |%p|DEBUGやFATALなどの優先度|DEBUG| |%t|スレッド名|main| |%c|カテゴリー名|| |%m|アプリケーションログメッセージ|これを出力しなかったら意味ない| |%n|改行コード|普通は文末に入れる| -以下は呼び出しクラスなど詳細な情報でデバッグには役立つがパフォーマンスとトレードオフなので本番運用時ははずすこと。 |%C|実際にログ出力されているクラス名。パフォーマンスが落ちるから運用時はNG|test.MyLogger| |%M|出力メソッド名。こちらもパフォーマンス低下|somemethod| |%F|出力javaファイル名|hoge.java| |%L|実行行数|100| このままだと出力文字列の長さがまちまちになるのでフォーマットをかますのが一般的。最初からフォーマットをいれてしまうとまさに暗号なので、まずは上記レイアウト項目が出力されるのを確認してからフォーマットの設定を入れるのがよい。 *Log4j 逆引き [#sece88a0] **出力するログレベルを制御したい [#ae36bf89] Thresholdを使う。 -INFO以上出力 log4j.appender.STDOUT.Threshold=INFO *サンプルソース [#cbbdcc1f] *etc [#y6e236ac] **パフォーマンス [#h3e23df8] ファイルに書き込む時は同時書き込みでファイルを壊さないようにロック待ちが発生する。数百人が同時にアクセスするようなシステムではパフォーマンスに大きな影響が出る可能性があるのでログ設計は慎重にやる必要がある。なんでもdebug出力はよろしくない。 #counter