2010-09-15 61 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> 
相關問題