Log4j

logを出力するAPIです。デバックはEclipseに任すとして、バッチ等でログをとりたいとき、パフォーマンスの分析、実行履歴をとるときに使用します。特にシステムでトラブったときとかに、調査するのに大変重要になります。ですので、プログラムを作る前に、しっかりとログレベルで何を出力するか決めてとりかかりましょう。ログレベルで個人ごとにバラバラに定義していると運用時に大変困ったことになります。ではログレベルとなんでしょうか。

1.fatal 致命傷
2.error 継続可能なエラー
3.warn  エラーではないが、警告を発しておいたほうがいいとき
4.info  実行時のログや操作ログ
5.debug デバック時に必要なログ
6.trace  debugよりさらに低いレベルでのログ

と5種類あり、運用時は3.warnで動かしましょうとすると1.fatal 2.error 3.warnのログが出力されます。開発時は5.debugでとするとすべてのレベルのログが出力さます。 このログレベルはlog4j.propertiesで設定します。log4j.xmlでも可能です。またCommons Loggingと一緒に使います。なぜか?実はLog4j以外にもいろいろなロギングAPIがありますが、このCommons Loggingでラップすることにより、柔軟にロギングAPIが変更できます。また5種類といってますが、ALLとOFFがあり、ALL は全レベルのログをとり、 OFF はログをとりません。

環境設定

まず、http://logging.apache.org/site/binindex.cgiからlogging-log4j-1.2.9.zipをダウンロードしましょう。この中のjarをtomcatの場合は、WEB-INF\libにコピーしておきます。 Log4jの設定をする前に、Commons Loggingの設定をしておきます。このCommons LoggingがどのロギングAPIを使うかを設定するために、commons-logging.propertiesに

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger

と記述しておきましょう。このファイルはクラスパスが通っているところにおいておきます。ではLog4jの設定ファイルです。名前はlog4j.propertiesです。またこれらの2つの設定ファイルはクラスパスが通っているところでいいのですが、tomcatで運用する場合は、WEB-INF\classesに、eclipseで開発するときはWEB-INF\srcの直下にでも置いておきましょう。するとコンパイル時にWEB-INF\classesへコピーしてくれます。

log4j.rootLogger=WARN,server,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p (%F:%L) - %m%n
log4j.appender.server=org.apache.log4j.DailyRollingFileAppender
log4j.appender.server.File=c:\\test.log
log4j.appender.server.DatePattern='.'yyyy-MM-dd
log4j.appender.server.layout=org.apache.log4j.PatternLayout
log4j.appender.server.layout.ConversionPattern=%d [%t] %-5p (%F:%L) - %m%n

1行目で、ログレベルをWARN以上で出力することにします。またAppenderをserverとstdoutの2つを設定しています。これでファイルとコンソールの2つに出力するといったことが可能です。serverはDailyRollingFileAppender(一定期間ごとにファイル先を変える)で、stdoutのorg.apache.log4j.ConsoleAppender?は、コンソールへの出力を行うAppenderです。他にもNTのイベントログへ出力するAppenderやsyslogへ出力するAppenderがあります。では特定のパッケージを指定する場合はどのようにすればいいのでしょうか。たとえば、com.test.cmnといったパッケージの場合は、

# log4j.rootLogger=WARN,server,stdout コメント
log4j.logger.com.test.cmn=WARN,server,stdout

としておきます。

log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p (%F:%L) - %m%n

とありますが、%dとかこの記号の意味は

%c:logger名
%C:クラス名
%d:発生した時刻
%F:ファイル名
%l:発生したクラス名、メソッド名、ソースファイル名、行数
%L:ログ要求を行った行番号
%m:設定されたメッセージ
%M:メソッド名
%n:改行
%p:優先度
%r:ログが出力されるまでの時間
%t:スレッドの名前
%x:スレッドのNDC

次にDailyRollingFileAppenderですが、

log4j.appender.server=org.apache.log4j.DailyRollingFileAppender
log4j.appender.server.DatePattern='.'yyyy-MM-dd

このDatePattern?

'.'yyyy-MM  各月の始めで切り替る
'.'yyyy-ww  各週の最初の日で切り替る。週の最初の日は、ロケールに依存
'.'yyyy-MM-dd  各日の真夜中に切り替る
'.'yyyy-MM-dd-a  各日の真夜中と正午に切り替る
'.'yyyy-MM-dd-HH  1時間毎の最初で切り替る
'.'yyyy-MM-dd-HH-mm 分毎の最初で切り替る

使用方法

Log log = LogFactory.getLog((this.getClass()).getName());
log.warn("This is warn.");

リンク

【実録ドキュメント】そのログ本当に必要ですか?

参考書籍


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-07-05 (木) 04:10:00 (6160d)