アプリケーションは、リリースした段階で終わりではありません。リリース後も以下のようなアプリケーションログを出力し、システムの安定稼働を継続するためのメンテナンスや、業務改善のフィードバックを行うことも大事な機能のひとつです。
- 利用状況の把握
- 不具合発生時の状況の把握
- レポーティングに利用する情報収集
様々だけど、運用に入ってから泣きを見ないように、しっかり設定しておきたい。
log4jを使ってログ出力
log4jは、Apache logging serviceのひとつで、Javaのロギングユーティリティです。今回は、Apache log4j 1.2.17について記載します。
- 柔軟な出力形式が可能
- テキスト形式の出力はもちろん、HTML、XMLのファイル出力、メール送信なんてのもある。
- 6段階のログレベルを提供
- ログの重要度に対してレベル付けすることができ、設定ファイルのパラメータでログ出力するレベルを簡単に変更できる。
これによって、リリース向けビルド時に、環境に合わせた設定ファイルに差し替えるだけでログ出力をコントロールできます。
設定ファイルの構成
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