アプリケーションの通常のINFOレベルのログがあります。必要なのは、すべてのERRORレベルのイベントをさらにログに記録して、個別のエラーログにすることです。私はこのような構成を使用しています:
<logger name="com.acme">
<level value="error"/>
<appender-ref ref="error"/>
</logger>
<logger name="com.acme">
<level value="info"/>
</logger>
<root>
<level value="warn"/>
<appender-ref ref="general"/>
</root>
この構成では、エラーのみが記録されます。最初に情報レベルロガーを置くと、一般的なアペンダーにのみログが記録されますが、エラーロガーは機能しません。両方とも機能させたいです。
あなたがする必要があるのは、単一の<logger>
定義のレベルがINFOであるが、2つのアペンダー定義では、それに応じてしきい値を設定します。
<appender name="ERROR_FILE">
<param name="Threshold" value="ERROR"/>
</appender>
<appender name="GENERAL">
<param name="Threshold" value="INFO"/>
</appender>
次に、両方のアペンダーをロガーに追加します。
<logger name="com.acme">
<level value="INFO"/>
<appender-ref ref="ERROR_FILE"/>
<appender-ref ref="GENERAL"/>
</logger>
ロガーに送られるログエントリは両方のアペンダーに送信されますが、それぞれ独立したしきい値があるため、ERROR_FILEアペンダーはERROR以上をログに記録します。
ファイル名に日付を含む完全に機能するソリューション:
<appender name="InfoFileAppender" class="org.Apache.log4j.rolling.RollingFileAppender">
<rollingPolicy class="org.Apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="FileNamePattern" value="/var/output/Info_%d{ddMMyyyy}.log" />
</rollingPolicy>
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{HH:mm:ss} %-5p %t %c{2} - %m%n" />
</layout>
<filter class="org.Apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="INFO" />
<param name="levelMax" value="INFO" />
</filter>
</appender>
<appender name="ErrorFileAppender" class="org.Apache.log4j.rolling.RollingFileAppender">
<param name="Threshold" value="ERROR" />
<rollingPolicy class="org.Apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="FileNamePattern" value="/var/output/Error_%d{ddMMyyyy}.log" />
</rollingPolicy>
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{HH:mm:ss} %-5p %t %c{2} - %m%n" />
</layout>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="InfoFileAppender" />
<appender-ref ref="ErrorFileAppender" />
</root>
Log4jフィルターを使用する必要があります。
<filter class="org.Apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="ERROR" />
<param name="levelMax" value="ERROR" />
</filter>
これにより、各レベルのログファイルを個別に作成できます。
Log4j2とXML形式の構成を使用している場合、 ThresholdFilter が適切なソリューションです。
サンプルを次に示します。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout>
<Pattern>%d %-5p %m%n</Pattern>
</PatternLayout>
<ThresholdFilter level="DEBUG"/>
</Console>
<RollingFile name="RollingDebugLogFile" fileName="logs/app-debug.log" filePattern="logs/$${date:yyyy-MM}/app-debug-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %-5p %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="20MB"/>
</Policies>
<ThresholdFilter level="DEBUG"/>
</RollingFile>
<RollingFile name="RollingErrorLogFile" fileName="logs/app-info.log" filePattern="logs/$${date:yyyy-MM}/app-info-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %-5p %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="20MB"/>
</Policies>
<ThresholdFilter level="ERROR"/>
</RollingFile>
<RollingFile name="RollingInfoLogFile" fileName="logs/app-error.log" filePattern="logs/$${date:yyyy-MM}/app-error-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %-5p %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="20MB"/>
</Policies>
<ThresholdFilter level="INFO"/>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="testLogger" level="DEBUG" additivity="false">
<AppenderRef ref = "Console" />
<AppenderRef ref="RollingErrorLogFile" />
<AppenderRef ref="RollingInfoLogFile" />
<AppenderRef ref="RollingDebugLogFile" />
</Logger>
<Root level="INFO">
<AppenderRef ref = "Console" />
<AppenderRef ref="RollingErrorLogFile" />
<AppenderRef ref="RollingInfoLogFile" />
<AppenderRef ref="RollingDebugLogFile" />
</Root>
</Loggers>
</Configuration>