2017-02-27 23 views
0

我正在嘗試使用同一個計劃進程的多個實例登錄到多個文件,並且根據運行時參數選擇了目標文件。在不同文件上記錄同一進程的多個實例

這裏的問題是,當一個實例正在運行時,沒有其他人能夠記錄,只產生空文件。

下面是一個示例場景:

  • 的schedlued任務program.exe A啓動並開始記錄到A_{currentDate}.log
  • 的schedlued任務program.exe B開始program.exe A仍在運行應該開始記錄到B_{currentDate}.log

當它們都結束時,第二個文件是空的,而第一個文件是空的,而這不是預期的結果,因爲我100%確定第二個實例有要記錄的東西。基本上,它看起來像第一個運行的實例阻止所有其他的日誌記錄,是唯一可以做到的事情。

鑑於我們對同一個程序有大約20個計劃任務,這會導致很多問題,因爲我們缺少一些重要的日誌。

這裏的log4net.config文件的一個片段:

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

和這裏的每個實例的初始化代碼:

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

它看起來對我的方式是,你的兩個進程都試圖保持兩個文件都打開(appender A和appender B),因此無論哪個先啓動都會阻止第二個進程運行。你可能只是抓住一個或另一個appender的引用來使用,但它正在創建它們,即使它只記錄到你抓取的任何一個。

您可能需要爲每個唯一的進程設置第二個GlobalContext屬性,並將其包含在文件名中,因爲它聽起來像是兩個進程在同一日期運行。

+0

根據你的建議,我最終從我的配置中除去了一個appender。這個appender現在寫入'%property {FileName} _%property {Date} .log'之類的東西,這樣可以阻止所有文件被單個實例鎖定。 – STT

相關問題