2009-03-16 13 views
58

私は "myprogram"ロガーに多くのlog4net呼び出しを行うプログラムを持っています。また、他のロガーへのlog4net呼び出しを行う他のコードを呼び出します。 "myprogram"のINFOより上位のすべてのログと、それ以外のすべてのWARNよりも上位のすべてのログをキャプチャしたい。このようにして、作業中の作業に固有の作業中メッセージを取得しますが、サポートコード内で起こっている可能性のある悪いことが通知されます。これをコンソールとログファイルの両方に送信します。 >ログインすべてのためにWARNと>特定の "MYPROGRAM" ロガーのINFO:これは私には完璧な理にかなってlog4netで重複したログを削除する

<log4net> 
    <root> 
     <level value="WARN" /> 
     <appender-ref ref="Console" /> 
     <appender-ref ref="LogFile" /> 
    </root> 
    <logger name="myprogram"> 
     <level value="INFO" /> 
     <appender-ref ref="Console" /> 
     <appender-ref ref="LogFile" /> 
    </logger> 
    <appender name="Console" type="log4net.Appender.ConsoleAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%message%newline" /> 
     </layout> 
     <threshold value="INFO" /> 
    </appender> 
    <appender name="LogFile" type="log4net.Appender.RollingFileAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="- %utcdate %level %logger %ndc %thread %message%newline" /> 
     </layout> 
     <appendToFile value="false" /> 
     <staticLogFileName value="true" /> 
     <rollingStyle value="Once" /> 
     <file value="mylogfile" /> 
     <immediateFlush value="true" /> 
     <threshold value="INFO" /> 
     <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
    </appender> 
</log4net> 

は、私は次のlog4netの設定を持っています。

問題は、私がコンソールとログファイルの両方でを2回に記録しているということです。これは、<root><logger>の両方の要素が満たされている場合にのみ発生します。どちらか一方を削除すると、残っているものが期待どおりに機能します。

myprogramが "root"と "myprogram"の両方にマッチするので、WARNエントリの二重ログを取得していたかどうかはわかりましたが、ROOTがWARNに設定されていてもINFOで起きています。

ここで何か間違っているのですか、これはlog4netのバグですか?あいまいですか。

答えて

72

あなたが二回メッセージをログに記録するように指示されているので、あなたが重複して取得されています。私はあなたには、いくつかの副作用を経験する可能性があるため、ここでは加法性を使用することをお勧めだけで、不要な設定を削除しません:

<root> 
    <level value="WARN" /> 
    <appender-ref ref="Console" /> 
    <appender-ref ref="LogFile" /> 
</root> 
<logger name="myprogram"> 
    <level value="INFO" /> 
</logger> 

それはからそれらを継承するので、あなたはロガーMYPROGRAMにアペンダ-REFを示すために必要はありません。ルートロガー;それらを再度指定すると、2回ログに記録されます。

+0

同じ問題が発生したとき、これはうまくいきました。これにより、加算性の問題も回避されます。 –

+1

これは正解です。ロガーはルートからアペンダーを継承します。ありがとう! –

+1

@Jeffreyあなたは相加性を使用した場合の問題点を認識していますか?私は、Googleが知っていることが書かれたものを見つけるのに成功していない。 – Tinister

67

additivityをfalseに設定してこの変更を試してください。

<root> 
    <level value="WARN" /> 
    <appender-ref ref="Console" /> 
    <appender-ref ref="LogFile" /> 
</root> 
<logger name="myprogram" additivity="false"> 
    <level value="INFO" /> 
    <appender-ref ref="Console" /> 
    <appender-ref ref="LogFile" /> 
</logger> 
+1

それはそうでした。バンドルありがとう。 –

+2

これは、 'myprogram'ログに対して記録されたすべてのメッセージがルートロガーにバブルアップしないようにするための良い方法です。 – Llyle

+0

これは私がグーグルで問題を解決してくれてありがとう。 – Kugel

関連する問題