代码之家  ›  专栏  ›  技术社区  ›  ruslander

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

  •  14
  • ruslander  · 技术社区  · 15 年前

    意图:

    a)我希望日志按日期滚动,格式如下:YYYY-MM-DD.TXT。

    b)除此之外,我还希望删除超出maxsizerollsbackups范围的旧文件。

    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>
    

    乙) RollingFileAppender+Delete的继承是实现这一点的唯一方法吗?

    3 回复  |  直到 8 年前
        1
  •  7
  •   Mafu Josh    15 年前

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

        2
  •  2
  •   Gábor    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版本,早期版本可能不允许重写必要的函数。)

        3
  •  1
  •   Pavel Calin    12 年前

    这里似乎提供了RollingFileAppender的补丁版本4 https://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>