log4jでLoggerひとつでログレベルの異なる複数のログ出力を実行する方法

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の仕組みと合わせて使うことで、きめ細かなログ出力を行うことができます。組合せにはパズル的な要素がありますが、ポイントを押さえて思い通りのログ出力を実現して下さい。