2017-02-27 26 views
0

同じスケジュールされたプロセスの複数のインスタンスで複数のファイルにログを記録しようとしていますが、実行時のパラメータに基づいて対象ファイルが選択されています。同じプロセスを複数の異なるファイルに記録する複数のインスタンス

ここで問題となるのは、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); 
    ... 
} 

誰かがそれで私を助けることができますか?

答えて

0

私の見方は、どちらのプロセスも、両方のファイルを開く(アペンダーAとアペンダーBの両方)にするようにしています。どちらか一方のアペンダーへの参照を取得するだけかもしれませんが、どちらのアペンダーにログを記録していても両方を作成しています。

2つのプロセスが同じ日付で実行されているように聞こえるので、一意で、ファイル名にそのプロセスを含めるプロセスごとに2番目のGlobalContextプロパティを設定する必要があります。

+0

あなたの提案に基づいて、構成から1つのアペンダー以外のすべてを削除しました。このアペンダは '%property {FileName} _%property {Date} .log'のようなものに書き込みます。これにより、すべてのファイルが単一のインスタンスによってロックされなくなります。 – STT

関連する問題