63

「myprogram」ロガーに対して多くのlog4net呼び出しを行うプログラムがあります。また、他のロガーにlog4net呼び出しを行う他のコードも呼び出します。「myprogram」のINFOより高いすべてのログと、その他すべてのWARNより高いすべてのログをキャプチャしたいと思います。このようにして、作業中のタスクに固有の進行中のメッセージを受け取りますが、サポートコードで発生する可能性のある悪いことが通知されます。これをコンソールとログファイルの両方に送信したい。

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

これは私にとって完全に理にかなっています。ログ>すべてについて警告し、>特定の「myprogram」ロガーについて情報。

問題は、コンソールとLogFileの両方でINFOメッセージが2回ログに記録されることです。<root>これは、要素と<logger>要素の両方が入力されている場合にのみ発生します。どちらかを削除すると、残りの1つは期待どおりに機能します。

WARNエントリのダブルロギングを取得しているかどうかは理解できましたが(myprogramは「root」と「myprogram」の両方に一致するため)、ROOTが(おそらく)WARNに設定されていてもINFOで発生しています。

私はここで何か間違ったことをしていますか、それともこれはlog4netのバグ/あいまいさですか?

4

2 に答える 2

80

メッセージを2回ログに記録するように指示しているため、重複しています。いくつかの副作用が発生する可能性があるため、ここで加法性を使用することはお勧めしません。単に不要な構成を削除してください。

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

ロガー myprogram で appender-ref を指定する必要はありません。これは、ルート ロガーからそれらを継承するためです。それらをもう一度指定すると、2 回ログに記録されます。

于 2009-03-19T11:47:05.817 に答える
71

加法性を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>
于 2009-03-16T17:08:43.827 に答える