0

我有一个要记录到 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>
4

2 回答 2

1

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

这里的这个链接很好地解释了如何添加必要的属性来实现时间戳。如果您不想记录到分钟,您可以选择只使用当前小时。

于 2012-07-11T16:39:10.173 回答
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}" />
于 2012-07-11T19:27:50.210 回答