将Log4Net RollingFileAppender设置为每周滚动一次

时间:2010-09-15 16:03:13

标签: c# .net log4net rollingfileappender

DatePattern字符串必须是SimpleDateFormatter will accept

不幸的是,这意味着,开箱即用,这不包括能够将边界设置为周数。有一些方法可以在C#中获得这个价值,但是我们可以扩展SimpleDateFormatter或提供IDateFormatter的不同实现并使用它来代替(甚至在自定义RollingFileAppender中使用它并不明显)。

那么我们怎样才能让Log4Net RollingFileAppender每周滚动一次?

3 个答案:

答案 0 :(得分: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 :(得分:1)

不是那么简单。 RollingFileAppender使用DateTime.ToString()来确定“滚动点”。 log4net帮助的声明没有错,因为SimpleDateFormatter也使用了这种方法,但它有点误导:你不能注入不同的日期格式化程序来使滚动文件追加器按你想要的方式工作。

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

答案 2 :(得分: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>