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

rus*_*der 14 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]
Run Code Online (Sandbox Code Playgroud)

对于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>
Run Code Online (Sandbox Code Playgroud)

for b)RollingFileAppender +删除东西的继承是实现这个目的的唯一方法吗?

Maf*_*osh 7

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

  • 所以你在2005年添加了补丁,它还没有被接受?! (2认同)

Gáb*_*bor 5

考虑到十多年过去了,它仍然不受支持,我选择了以下覆盖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);
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

配置就像原始类一样简单:

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

请注意,*.log在日志目录中查找文件仅PreserveLogFileNameExtension在使用 或DatePattern用于在文件名末尾包含扩展名时才有意义。如果您需要不同的命名方案,请同步修改它们。

(我使用的是 log4net 的 2.0.8 版本,早期版本可能不允许覆盖必要的功能。)