同一进程的多个实例记录在不同的文件上
Multiple instances of same process logging on different files
我正在尝试使用同一计划进程的多个实例记录到多个文件,目标文件是根据 运行 时间参数选择的。
这里的问题是,当一个实例正在 运行ning 时,没有其他实例能够记录,只生成空文件。
这是一个示例场景:
- 计划的任务
program.exe A
开始并开始记录到A_{currentDate}.log
- 计划的任务
program.exe B
开始 而 program.exe A
仍在 运行ning 并且 应该 开始登录 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);
...
}
有人可以帮我吗?
在我看来,您的两个进程都试图让两个文件保持打开状态(appender A 和 appender B),因此无论哪个先启动都会阻止 运行ning 中的第二个进程。您可能只获取对一个或另一个 appender 的引用以供使用,但它正在创建这两个 appender,即使它只记录到您获取的任何一个。
您可能需要为每个唯一的进程设置第二个 GlobalContext 属性,并将其包含在文件名中,因为这听起来像是两个进程 运行 在同一日期。
我正在尝试使用同一计划进程的多个实例记录到多个文件,目标文件是根据 运行 时间参数选择的。
这里的问题是,当一个实例正在 运行ning 时,没有其他实例能够记录,只生成空文件。
这是一个示例场景:
- 计划的任务
program.exe A
开始并开始记录到A_{currentDate}.log
- 计划的任务
program.exe B
开始 而program.exe A
仍在 运行ning 并且 应该 开始登录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);
...
}
有人可以帮我吗?
在我看来,您的两个进程都试图让两个文件保持打开状态(appender A 和 appender B),因此无论哪个先启动都会阻止 运行ning 中的第二个进程。您可能只获取对一个或另一个 appender 的引用以供使用,但它正在创建这两个 appender,即使它只记录到您获取的任何一个。
您可能需要为每个唯一的进程设置第二个 GlobalContext 属性,并将其包含在文件名中,因为这听起来像是两个进程 运行 在同一日期。