2009-12-03 16 views
48

私はアプリケーション用の通常のINFOレベルのログを持っています。私が必要とするのは、すべてのERRORレベルイベントを別々のエラーログに追加記録することです。私はこのような設定を使用しています:log4jを設定して、同じロガーの異なるファイルに異なるログレベルを記録する方法

<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> 

この設定ではエラーのみが記録されます。最初に情報レベルのロガーを置くと、一般的なアペンダーにのみログが記録されますが、エラーロガーは機能しません。私は彼らの両方を働かせたいと思っています。

答えて

60

あなたが行う必要があるのは、定義されたレベルのINFOを持つ単一の<logger>定義ですが、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以上。

+0

@vilmontsあなたは二度同じロガー(com.acme)を定義する場合、そのうちの一つは上書きされ、そしてあなたが見ることができない理由ですINFOメッセージ:最初のエラーメッセージ( "エラー"レベル)は、次の情報メッセージを消去します。 –

+1

ありがとう、スカフマン。あなたは私の命を救いました。 – vilmonts

+1

しかし、私は自分のERROR_FILEアペンダが他のロガーの選択されたデバッグメッセージを受け取れるようにしたいのですか? – AmanicA

4

あなたは、log4jのフィルターを使用する必要があります。

<filter class="org.apache.log4j.varia.LevelRangeFilter"> 
    <param name="levelMin" value="ERROR" /> 
    <param name="levelMax" value="ERROR" /> 
</filter> 

あなたが個別に各レベルのログファイルを作成することができる方法を。ファイル名に日付を含む

+0

これはすばらしい答えです。私は自分のlog4j構成に.propertiesファイルを使用しています。 .propertiesでこのフィルタを設定する方法について、あなたの答えに含めてください。お願いします –

5

全作業溶液:

<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> 
関連する問題