log4jの設定ファイル(log4j.properties)の書き方

アプリケーションは、リリースした段階で終わりではありません。リリース後も以下のようなアプリケーションログを出力し、システムの安定稼働を継続するためのメンテナンスや、業務改善のフィードバックを行うことも大事な機能のひとつです。

  • 利用状況の把握
  • 不具合発生時の状況の把握
  • レポーティングに利用する情報収集

様々だけど、運用に入ってから泣きを見ないように、しっかり設定しておきたい。

log4jを使ってログ出力

log4jは、Apache logging serviceのひとつで、Javaのロギングユーティリティです。今回は、Apache log4j 1.2.17について記載します。

  • 柔軟な出力形式が可能
    • テキスト形式の出力はもちろん、HTML、XMLのファイル出力、メール送信なんてのもある。
  • 6段階のログレベルを提供
    • ログの重要度に対してレベル付けすることができ、設定ファイルのパラメータでログ出力するレベルを簡単に変更できる。
  • 外部の設定ファイル
    • ライブラリから分離した設定ファイルとして、プロパティファイル(log4j.properties)、またはXMLファイルで設定することが可能です。

これによって、リリース向けビルド時に、環境に合わせた設定ファイルに差し替えるだけでログ出力をコントロールできます。

設定ファイルの構成

Logger
  • 名前
    • Loggerに名前を付けます。ピリオドで区切ることで階層構成(親子関係)を作ることができます。デフォルト設定では、子Loggerのログは親Loggerに伝搬します。
  • ログレベル
    • 6段階のログレベル(FATAL>ERROR>WARN>INFO>DEBUG>TRACE)の中から設定します。例えば、INFOを設定するとFATAL,ERROR,WARN,INFOレベルのログが出力され、DEBUG,TRACEレベルのログは出力されません。SAStrutsで開発時にrootLoggerのログレベルがDEBUGに設定されていて、session,request,context等の情報が氾濫し見づらい時は、ログレベルをINFOにしておくと重要なログを見逃すことがなく自分好みです。必要な時だけDEBUGに戻します。
  • Appender
    • カンマ区切りで複数指定できます。複数指定できるのでログを、コンソールとファイルに同時に出力することが可能です。これについては、後述します。
Appener

出力形式の設定をします。コンソール、ファイル、Syslogやメール送信などがあり多彩な出力が可能です。

  • 名前
    • Appenderに名前を付けます。この名前とLoggerのAppender設定が関連づきます。
  • Layout(+各種オプション)
    • Layoutクラスの指定と、各Layoutクラスのオプションを設定します。これについては、後述します。
Layout

Appenderに対して出力レイアウトを設定します。
Layout一覧

サンプル設定ファイル(log4j.properties)

さて、やっと本題。

#---------------------------------------------------------------------------------------
# Logger
#---------------------------------------------------------------------------------------
# Root
log4j.rootLogger=INFO, ROOT

# OperationLog
log4j.logger.operation=DEBUG, OPERATION

#---------------------------------------------------------------------------------------
# Appender
#---------------------------------------------------------------------------------------
# for Root
log4j.appender.ROOT=org.apache.log4j.ConsoleAppender
log4j.appender.ROOT.layout=org.apache.log4j.PatternLayout
log4j.appender.ROOT.layout.ConversionPattern=%-5p - %m%n

# for SQL
log4j.appender.OPERATION=org.apache.log4j.RollingFileAppender
log4j.appender.OPERATION.File=/var/log/tomcat/operation.log
log4j.appender.OPERATION.Append=true
log4j.appender.OPERATION.MaxFileSize=1MB
log4j.appender.OPERATION.MaxBackupIndex=20
log4j.appender.OPERATION.layout=org.apache.log4j.PatternLayout
log4j.appender.OPERATION.layout.ConversionPattern=%-5p - %m%n

出力処理

Logger logger = Logger.getLogger("operation");
logger.fatal("test operation fatal");
logger.error("test operation error");
logger.warn("test operation warn");
logger.info("test operation info");
logger.debug("test operation debug");
logger.trace("test operation trace");

出力結果

まず、Logger(operation)により、/var/log/tomcat/operation.logにログレベルDEBUG以上のログが出力されます。

/var/log/tomcat/operation.log
FATAL - test operation fatal
ERROR - test operation error
WARN  - test operation warn
INFO  - test operation info
DEBUG - test operation debug


次に、rootLoggerにより、コンソールにログレベルINFO以上のログが出力されます。これは、Logger(operation)が、rootLoggerの子Loggerになっているためで、Logger(operation)のログ出力がrootLoggerに伝搬しコンソールに出力されます。
この伝搬の仕組みについては、長くなるので、次のエントリーに回します。

コンソール
FATAL - test operation fatal
ERROR - test operation error
WARN  - test operation warn
INFO  - test operation info