我有一个批处理过程,我想记录到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>
答案 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}" />