Log4jlogを出力する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."); リンク参考書籍 |