2017-02-27 57 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

相关问题