同一进程的多个实例记录在不同的文件上

Multiple instances of same process logging on different files

我正在尝试使用同一计划进程的多个实例记录到多个文件,目标文件是根据 运行 时间参数选择的。

这里的问题是,当一个实例正在 运行ning 时,没有其他实例能够记录,只生成空文件。

这是一个示例场景:

当它们都结束时,第二个文件是空的,而第一个文件不是,这不是预期的结果,因为我 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);
    ...
}

有人可以帮我吗?

在我看来,您的两个进程都试图让两个文件保持打开状态(appender A 和 appender B),因此无论哪个先启动都会阻止 运行ning 中的第二个进程。您可能只获取对一个或另一个 appender 的引用以供使用,但它正在创建这两个 appender,即使它只记录到您获取的任何一个。

您可能需要为每个唯一的进程设置第二个 GlobalContext 属性,并将其包含在文件名中,因为这听起来像是两个进程 运行 在同一日期。