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

时间:2010-02-18 17:04:59

标签: log4net

意图:

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 +删除东西的继承是实现这个目标的唯一方法吗?

3 个答案:

答案 0 :(得分:7)

几个月前,我花了一些时间研究这个问题。 v1.2.10不支持基于按日期滚动删除较旧的日志文件。它位于下一版本的任务列表中。我自己获取了源代码并添加了功能,如果他们感兴趣,可以将其发布给其他人。问题和补丁可以在https://issues.apache.org/jira/browse/LOG4NET-27找到。

答案 1 :(得分:2)

考虑到十多年过去了并且仍然不支持,我选择了以下具有所需功能的覆盖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版,早期版本可能不允许覆盖必要的功能。)

答案 2 :(得分:1)

这里提供的RollingFileAppenderer的补丁版本4 https://issues.apache.org/jira/secure/attachment/12565940/RollingFileAppender.zip似乎可以进行微小改动:在第1286行替换&#34;。*&#34;用&#34; *&#34;。

为此,您可以使用以下配置:

<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>