Log4jで同一内容を複数の出力先に出力させる


 システムを運用しているとログが重要な意味を持ってくる。

 カットオーバーしたばかりの頃はシステムも安定しおらず、初期不良とでも言うべき障害に見舞われることもある。そこで、安定するまではデバッグログやトレースログを出力しておき、障害の数が落ち着いてきたらそれらの出力を止めるというケースが考えられる。ただ、デバッグログやトレースログを出力している場合、ログファイルが膨らんでしまい、監視ツールなどにログファイルを食わせている場合には負荷の面で不安が出てくる。

 そういう時、FATALレベルやERRORレベルのログだけを別ファイルにミラーリング出来たら便利だ。そのエラーログはサイズも小さく、監視ツールに食わせても安心だ。そしてエラーを検出したらデバッグログやトレースログを調査するという運用が可能になる。

 では、そのようなログを出力するにはどうすればよいだろうか。

 エラーログ専用のロガーを定義して、プログラムからそれぞれログ記録メソッドを呼び出すという方法も無くはないが、コードとしては冗長で無意味である。そうではなく、以下の例のように1つのロガーに対して複数のアペンダを設定すればよい。ERRORレベル以上のログがエラーログにも出力されるようになる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# RootLogger
log4j.rootLogger=TRACE,A,B

# Logger
log4j.logger.myLogger=TRACE,A,B

# Appender A
log4j.appender.A=org.apache.log4j.FileAppender
log4j.appender.A.Append=true
log4j.appender.A.threshold=DEBUG
log4j.appender.A.File=C:/temp/normal.log
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %m%n

# Appender B
log4j.appender.B=org.apache.log4j.FileAppender
log4j.appender.B.Append=true
log4j.appender.B.threshold=ERROR
log4j.appender.B.File=C:/temp/error.log
log4j.appender.B.layout=org.apache.log4j.PatternLayout
log4j.appender.B.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %m%n

 尚、複数指定するアペンダは、同じアペンダクラスでなくても、例えばファイルとコンソールに出力するといった指定も可能である。

Leave a Reply

*

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

アーカイブ