基于日期的日志文件,无需重复运行

时间:2012-07-11 14:56:48

标签: logging log4net log4net-configuration

我有一个批处理过程,我想记录到MyProcess.YYYYMMDD.log。通常它每天运行,但有时由于故障或测试,它每天运行多次。基于查看其他log4net问题,我使用RollingLogFileAppender创建基于日期的文件。但是,如果在同一天发生多次运行,我最终会将这些多次运行记录到同一文件中。

理想情况下,我希望批处理的第一次运行记录到MyProcess.YYYYMMDD.log,但第二次运行在同一天记录到MyProcess.YYYYMMDD.2.log等。

使用log4net实现此目的的最简单方法是什么?

如果重要,我当前的appender配置如下所示:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="MyProcess.log" />
  <appendToFile value="true" />
  <rollingStyle value="Date" />
  <datePattern value=".yyyyMMdd" />
  <staticLogFileName value="false"/>
  <PreserveLogFileNameExtension value="true"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
  </layout>
</appender>

2 个答案:

答案 0 :(得分:1)

不确定是否可以将增量变量添加到日志的日期戳中。也许更好的方法是在文件名后附加一个时间戳,以便您可以通过这种方式区分它。

这个link here很好地解释了如何添加必要的属性来实现时间戳。如果您不想记录到那一刻,您可以选择仅使用当前小时。

答案 1 :(得分:1)

如果您确定两个进程无法同时启动,则可以以编程方式设置日志文件。

例如在启动之前在启动之前设置日志文件的名称,例如

var logfileName = String.Format("{0}{1:yyyyMMdd}.log" , 
                 ".\logs\MyProcess" , DateTime.Now );

然后检查日志文件是否已存在,如果是,则更改logfileName,直到获得唯一名称。

然后将此信息传递给log4net,如。

log4net.GlobalContext.Properties["LogName"] = logfileName;

这需要在记录第一条消息之前完成。

您还需要更改配置文件以使用此属性。

<file type="log4net.Util.PatternString" value="%property{LogName}" />