log4net - 按日期删除旧文件滚动

15

意图:

a) 我希望我的日志按照以下文件格式 yyyy-MM-dd.txt 进行按日期卷动。

b) 除此之外,我还想删除超出 maxSizeRollBackups 范围的旧文件。

CAUTION A maximum number of backup files when rolling on date/time 
  boundaries is not supported. [RollingFileAppender spec][1]

解决方案

a) 只需要进行配置即可。

<appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="logs\" />
  <appendToFile value="true" />
  <rollingStyle value="Date" />
  <maxSizeRollBackups value="30" />
  <datePattern value="yyyy-MM-dd'.txt'" />
  <staticLogFileName value="false" />
  <layout type="log4net.Layout.XmlLayoutSchemaLog4j"/>
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
</appender>
对于 b):继承RollingFileAppender并删除一些东西是实现这一目标的唯一方法吗?

这里是注意事项 -> http://logging.apache.org/log4net/release/sdk/log4net.Appender.RollingFileAppender.html - ruslander
3个回答

8

考虑到已经过去了十多年,仍然不支持该功能,我选择了以下解决方案来覆盖RollingFileAppender

public class RollingDateAppender : RollingFileAppender {
  public TimeSpan MaxAgeRollBackups { get; set; }

  public RollingDateAppender()
    : base() {
    PreserveLogFileNameExtension = true;
    StaticLogFileName = false;
  }

  protected override void AdjustFileBeforeAppend() {
    base.AdjustFileBeforeAppend();

    string LogFolder = Path.GetDirectoryName(File);
    var CheckTime = DateTime.Now.Subtract(MaxAgeRollBackups);
    foreach (string file in Directory.GetFiles(LogFolder, "*.log")) {
      if (System.IO.File.GetLastWriteTime(file) < CheckTime)
        DeleteFile(file);
    }
  }

}

配置与原始类一样简单:

roller = new RollingDateAppender {
  AppendToFile = true,
  File = ...;
  MaxAgeRollBackups = TimeSpan.FromDays(7),
  RollingStyle = RollingFileAppender.RollingMode.Date,
  ...
};
roller.ActivateOptions();
BasicConfigurator.Configure(roller);

请注意,在日志目录中查找*.log文件只有在使用PreserveLogFileNameExtension或使用DatePattern在文件名末尾包含扩展名时才有意义。如果您需要不同的命名方案,请同步修改这些内容。
(我使用了log4net的2.0.8版本,较早的版本可能不允许覆盖必要的功能。)

这将适用于rollingStyle属性设置为“composite”吗? - Dibzmania

7

我在几个月前花了一些时间研究这个问题。v1.2.10不支持根据日期滚动删除旧的日志文件。这已经列入下一个版本的任务清单中。我拿到了源代码并自己添加了这个功能,并且如果其他人感兴趣,我把它发布了出来。问题和补丁可以在https://issues.apache.org/jira/browse/LOG4NET-27找到。


2
你在2005年就提交了这个补丁,但它至今还未被接受?! - Matthew Lock

1

看起来这里提供的RollingFileAppenderer的补丁版本4https://issues.apache.org/jira/secure/attachment/12565940/RollingFileAppender.zip可以正常工作,只需要进行一些小修改:在第1286行将“.*”替换为“*”。

您可以使用以下配置:

<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="MyProduct.log" />
  <param name="DatePattern" value="'_'yyyy-MM-dd"/>
  <param name="AppendToFile" value="true"/>
  <param name="RollingStyle" value="Date"/>
  <param name="StaticLogFileName" value="false"/>
  <param name="MaxDateRollBackups" value="3" />
  <param name="preserveLogFileNameExtension" value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%r %d [%t] %-5p %c - %m%n"/>
  </layout>
</appender>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接