同じスケジュールされたプロセスの複数のインスタンスで複数のファイルにログを記録しようとしていますが、実行時のパラメータに基づいて対象ファイルが選択されています。同じプロセスを複数の異なるファイルに記録する複数のインスタンス
ここで問題となるのは、1つのインスタンスが実行されている間に、他のインスタンスがログに記録できず、空のファイルしか作成できないということです。ここで
は、サンプルシナリオです:
- schedluedタスク
program.exe A
開始され、A_{currentDate}.log
- にログインするために開始されます
program.exe A
はまだとを実行している間を開始program.exe B
schedluedタスクがB_{currentDate}.log
へのロギングを開始する必要があります
両者が終了すると、第2のファイルが空であり、第1のファイルは空ではありません。これは、第2のインスタンスに何かが記録されていることを100%確信しているため、期待した結果ではありません。基本的には、実行する最初のインスタンスが、他のすべてのインスタンスをログから守り、唯一実行できるように見えるように見えます。
同じプログラムに対して約20のスケジュールされたタスクがあることを考えると、いくつかの重要なログが欠落しているため、これは多くの問題を引き起こしています。
<appender name="A_appender" type="log4net.Appender.FileAppender">
<file type="log4net.Util.PatternString" value="A_%property{Date}.log" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
</layout>
</appender>
<appender name="B_appender" type="log4net.Appender.FileAppender">
<file type="log4net.Util.PatternString" value="B_%property{Date}.log" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
</layout>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
</layout>
</appender>
...
<logger name="A.Logger">
<appender-ref ref="A_appender" />
<level value="DEBUG" />
</logger>
<logger name="B.Logger">
<appender-ref ref="B_appender" />
<level value="DEBUG" />
</logger>
...
<root>
<level value="ALL" />
<appender-ref ref="ConsoleAppender" />
</root>
、ここで各インスタンスの初期化コードがあります:ここで
はlog4net.config
ファイルの抜粋です
protected Module(string logName)
{
ThreadContext.Properties["Date"] = GlobalContext.Properties["Date"] = DateTime.Now.ToString("yyyyMMdd");
XmlConfigurator.Configure(new System.IO.FileInfo(properties.get("log4net.config.file")));
log = LogManager.GetLogger(logName);
...
}
誰かがそれで私を助けることができますか?
あなたの提案に基づいて、構成から1つのアペンダー以外のすべてを削除しました。このアペンダは '%property {FileName} _%property {Date} .log'のようなものに書き込みます。これにより、すべてのファイルが単一のインスタンスによってロックされなくなります。 – STT