DEBUG以上は標準出力に出力し、ERROR以上はファイルに出力したい場合、Loggerの階層構造とadditivityや、Appenderの複数設定を駆使しても実現することができません。また、Java側のロジックで別々のLoggerを取得して、同じログを出力する方法もありますが冗長です。
これを実現するには、AppenderのThreshold属性を利用してログレベルのしきい値でフィルタリングする方法があります。
設定(log4j.properties)
#--------------------------------------------------------------------------------------- # Logger #--------------------------------------------------------------------------------------- # Root log4j.rootLogger=DEBUG, CONSOLE,MORE_THAN_ERROR #--------------------------------------------------------------------------------------- # Appender #--------------------------------------------------------------------------------------- # for Console log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d %-5p %c{1} - %m%n # for File log4j.appender.MORE_THAN_ERROR=org.apache.log4j.RollingFileAppender log4j.appender.MORE_THAN_ERROR.Threshold=ERROR log4j.appender.MORE_THAN_ERROR.File=error.log log4j.appender.MORE_THAN_ERROR.Append=true log4j.appender.MORE_THAN_ERROR.MaxFileSize=1MB log4j.appender.MORE_THAN_ERROR.MaxBackupIndex=3 log4j.appender.MORE_THAN_ERROR.layout=org.apache.log4j.PatternLayout log4j.appender.MORE_THAN_ERROR.layout.ConversionPattern=%d %-5p %c{1} - %m%n
appender.MORE_THAN_ERRORのThreshold属性に「ERROR」を設定しています。
これによりappender.MORE_THAN_ERRORは、ログレベルERROR以上のログ出力しか行いません。では、例として以下のようなコードを実行してみます。
log4jのログ出力処理
import org.apache.log4j.Logger; public class Main { public static void main(String[] args) { // rootLogger取得 Logger rootLogger = Logger.getLogger("root"); rootLogger.fatal("fatal"); rootLogger.error("error"); rootLogger.warn("warn"); rootLogger.info("info"); rootLogger.debug("debug"); rootLogger.trace("trace"); } }
ひとつのLoggerに対して各ログレベルの出力を行なっています。結果は、次のとおりです。
出力結果
標準出力(appender.CONSOLEによる出力)
2013-01-18 00:48:31,976 FATAL root - fatal 2013-01-18 00:48:31,979 ERROR root - error 2013-01-18 00:48:31,979 WARN root - warn 2013-01-18 00:48:31,979 INFO root - info 2013-01-18 00:48:31,979 DEBUG root - debug
error.log(appender.MORE_THAN_ERRORによる出力)
2013-01-18 00:48:31,976 FATAL root - fatal 2013-01-18 00:48:31,979 ERROR root - error
rootLoggerのログレベルは、DEBUGなのでappender.CONSOLEの出力は、FATALからDEBUGまでとなっています。
これに対して、appender.MORE_THAN_ERRORの出力は、FATALからERRORまでとなっており、Threshold属性によりフィルタリングされていることがわかります。
まとめ
前回のLoggerの階層構造とadditivityの仕組みと合わせて使うことで、きめ細かなログ出力を行うことができます。組合せにはパズル的な要素がありますが、ポイントを押さえて思い通りのログ出力を実現して下さい。