「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のバグ/あいまいさですか?