簡體   English   中英

同一進程的多個實例記錄在不同的文件上

[英]Multiple instances of same process logging on different files

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

這里的問題是,當一個實例在運行時,其他任何實例都無法登錄,僅生成空文件。

這是一個示例方案:

  • 計划任務program.exe A啟動並開始記錄到A_{currentDate}.log
  • 計划任務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);
    ...
}

有人可以幫我嗎?

在我看來,您的兩個進程都試圖同時打開兩個文件(附加程序A和附加程序B),因此無論哪個先啟動,都會阻止第二個進程運行。 您可能只抓住了要使用的一個或另一個附加程序的引用,但是即使僅記錄到您抓住的那個附加程序,它也會創建它們兩者。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM