2010-09-15 46 views
5

DatePattern字符串需要是SimpleDateFormatterwill accept已将Log4Net RollingFileAppender设置为每周滚动

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

那么我们如何才能让Log4Net RollingFileAppender每周滚动?

回答

1

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

如果您确实需要逐周功能,那么最简单的方法是从RollingFileAppender派生并覆盖AdjustFileBeforeAppend()方法。没有测试这个,但这应该做的伎俩。

2

我每周都有矿滚动。您必须设置您的dateformat以包含月份的日期以生成唯一的文件名。

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> 
相关问题