2010-09-15 9 views
5

olmasını sağlayın SimpleDateFormatterwill accept öğesinin olması gerekir.Bir Log4Net RollingFileAppender'ın haftalık olarak dönmesi için

Maalesef bu, kutunun dışında, sınırın bir hafta numarası olarak ayarlanabilmesi anlamına gelmez. Bu değeri C# alma yolları vardır, ancak SimpleDateFormatter'u genişletebileceğimiz veya IDateFormatter'un farklı bir uygulamasını sağlayabileceğimiz ve bunun yerine (veya özel bir RollingFileAppender) kullanabileceğimiz açık değildir.

Haftalık olarak nasıl bir Roll4Net RollingFileAppender alabiliriz?

cevap

1

Bu o kadar basit değil. RollingFileAppender, "roll point" değerini belirlemek için DateTime.ToString() kullanır. Log4net ifadesi, SimpleDateFormatter'un bu yöntemi kullanması nedeniyle yanlış olmamasına yardımcı olur, ancak biraz yanıltıcıdır: Yuvarlanan dosya ekleyicisinin istediğiniz şekilde çalışmasını sağlamak için farklı bir tarih biçimlendirici enjekte edemezsiniz.

Gerçekten haftaya göre rulo özelliğine ihtiyacınız varsa, en kolay yol RollingFileAppender türetmek ve AdjustFileBeforeAppend() yöntemini geçersiz kılmak olacaktır. Bunu test etmedim, ama bu hile yapmalı.

2

Her hafta madencilik yapıyorum. Tarih biçimini, benzersiz dosya isimleri oluşturmak için ayın gününü de içerecek şekilde ayarlamanız gerekir.

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

Ben de her nasılsa log4net sürümü (1.2.15.0) üzerinde çalışmıyor, TRİ çözümünü uygun yöntemi test ederek, günlük dosyası haftalık yuvarlanmaya aynı sorunu yüzleşmek, ancak onun cevabını esinlenerek ve kaynak kodu okumak, ben haftada adıyla günlük dosyası oluşturmak için bir çözüm yaptık

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)); 
      } 
     } 
    } 
} 

ve log.config benim pasajı (Pazar günü tarihi olarak adlandırılır)

<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>