私の通常のロギング経験では、 のILog
ようなものを使用して各クラスにインスタンスを作成するだけで、インスタンスごとmylog = LogManager.GetLogger( name)
に一意の Logger が得られます。すべてが同じファイルに記録され、うまく機能します。
しかし、今では 2 つの別々のファイルにログを記録したい状況があります。次の logging.xml を使用してこれを実現します。
<?xml version="1.0" encoding="utf-8"?>
<log4net>
<appender name="Console" type="log4net.Appender.ConsoleAppender">
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="INFO"/>
<param name="LevelMax" value="FATAL"/>
</filter>
<layout type="log4net.Layout.PatternLayout">
<!-- Pattern to output the caller's file name and line number -->
<conversionPattern value="%date{yyyy-MM-dd-HH_mm_ss.fff} [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<appender name="File" type="log4net.Appender.FileAppender">
<file type="log4net.Util.PatternString" value="%property{LogName}" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{yyyy-MM-dd-HH_mm_ss.fff} [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="Console" />
<appender-ref ref="File" />
</root>
</log4net>
コード ビハインドではFileAppender
、一意の名前を付けて、インスタンスごとに名前を設定します。
log4net.GlobalContext.Properties["LogName"] = unique_path_here;
「test1」というオブジェクトを 1 つインスタンス化すると、「test1.log」ファイルが作成されます。「test2」という別のオブジェクトをインスタンス化すると、「test2.log」ファイルが作成されます。各オブジェクトでメソッドを呼び出し始めるまで、すべてがうまく機能しているように見えます。呼び出しを交互に行うと、最初は 1 つのオブジェクトのデータが他のオブジェクトのファイルに書き込まれますが、その後、データが正しいファイルに記録されます。たとえば、何が起こるかの簡単な例を次に示します。
- test1.log() -> test1.log に書き込みます
- test2.log() -> test2.log に書き込みます
- test1.log() -> test2.log に 1 行を書き込み、残りは test1.log に書き込みます
- test2.log() -> lint を test1.log に書き込み、残りは test2.log に書き込みます
2 つの方法を並行して実行すると、すべての行がいずれかのファイルに書き込まれます。次に、本当に奇妙なのは、ほとんど使用されている他のファイルが二度と書き込まれないことです!
次にどこを見るべきかわかりません。GetLogger を介して Logger インスタンスを作成し、それに一意の名前を渡し、これがプライベート メンバー変数である場合、間違ったファイルへの書き込みが開始される可能性はありますか?