每周滚动一次的Log4Net RollingFileAppender设置

5
< p > DatePattern 字符串需要是 SimpleDateFormatter 接受 的内容。

< p > 不幸的是,这意味着默认情况下无法将边界设置为一周。 在 C# 中有获取此值的方法,但显然我们无法扩展 SimpleDateFormatter 或提供不同的 IDateFormatter 实现并使用它(甚至在自定义的 RollingFileAppender 中)。

< p > 那么我们如何让 Log4Net 的 RollingFileAppender 每周滚动?

3个回答

2

我每周都会启动我的程序。你必须设置日期格式以包括月份中的日期,以生成唯一的文件名。

class RollingOverWeekFileAppender : RollingFileAppender
{
    private DateTime nextWeekendDate;

    public RollingOverWeekFileAppender()
    {
        CalcNextWeekend(DateTime.Now);
    }

    private void CalcNextWeekend(DateTime time)
    { 
        // Calc next sunday
        time = time.AddMilliseconds((double)-time.Millisecond);
        time = time.AddSeconds((double)-time.Second);
        time = time.AddMinutes((double)-time.Minute);
        time = time.AddHours((double)-time.Hour);
        nextWeekendDate = time.AddDays((double)(7 - (int)time.DayOfWeek));
    }

    protected override void AdjustFileBeforeAppend()
    {
        DateTime now = DateTime.Now;

        if (now >= nextWeekendDate)
        {
            CalcNextWeekend(now);
            // As you included the day and month AdjustFileBeforeAppend takes care of creating 
            // new file with the new name
            base.AdjustFileBeforeAppend();
        }
    }
}

1

我也遇到了同样的问题,想要每周滚动日志文件。尝试了GLM解决方法,但在log4net(1.2.15.0版本)上并没有奏效。受他回答的启发,并研究了源代码后,我找到了一个生成按周命名的日志文件的解决方案(以周日日期命名)。

namespace log4net.Appender
{
    class RollingOverWeekFileAppender : RollingFileAppender
    {
        public RollingOverWeekFileAppender()
        {
            IDateTime dt = new SundayDateTime();
            DateTimeStrategy = dt;
        }

        class SundayDateTime : IDateTime
        {
            public DateTime Now
            {
                get { return CalcThisSunday(DateTime.Now); }
            }

            private DateTime CalcThisSunday(DateTime time)
            {
                // Calc this sunday
                time = time.AddMilliseconds((double)-time.Millisecond);
                time = time.AddSeconds((double)-time.Second);
                time = time.AddMinutes((double)-time.Minute);
                time = time.AddHours((double)-time.Hour);
                return time.AddDays((double)(-(int)time.DayOfWeek));
            }
        }
    }
}

这是我的log.config文件的片段:

<appender name="Log" type="log4net.Appender.RollingOverWeekFileAppender">
  <file type="log4net.Util.PatternString">
    <conversionPattern value=".\log-" />
  </file>
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
  <encoding value="utf-8" />
  <staticLogFileName value="false"/>
  <appendToFile value="true" />
  <rollingStyle value="Date"/>
  <datePattern value="yyyyMMdd.lo\g"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date&#9;%level&#9;%logger{1}&#9;%message%newline" />
  </layout>
</appender>

1

这并不是那么简单。RollingFileAppender使用DateTime.ToString()来确定“滚动点”。log4net帮助文档的陈述并没有错,因为SimpleDateFormatter也使用了这种方法,但有些误导:您无法注入不同的日期格式化程序以使滚动文件附加器按照您想要的方式工作。

如果您真的需要按周滚动功能,那么最简单的方法是从RollingFileAppender派生,并覆盖AdjustFileBeforeAppend()方法。我没有测试过,但应该可以解决问题。


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