2010-09-15 3 views
5

Die DatePattern Zeichenfolge muss etwas sein, das die SimpleDateFormatterwill accept.Lassen Sie ein Log4Net RollingFileAppender-Set wöchentlich rollen

Leider bedeutet dies, dass es standardmäßig nicht möglich ist, die Grenze als Wochennummer festzulegen. Es gibt Möglichkeiten, diesen Wert in C# zu erhalten, aber es ist nicht offensichtlich, dass wir die SimpleDateFormatter erweitern oder eine andere Implementierung von IDateFormatter bereitstellen und diese stattdessen (oder sogar in einer benutzerdefinierten RollingFileAppender) verwenden können.

Also, wie können wir ein Log4Net RollingFileAppender wöchentlich rollen?

Antwort

1

Es ist nicht so einfach. Der RollingFileAppender verwendet DateTime.ToString(), um den "Rollpunkt" zu bestimmen. Die Aussage der log4net-Hilfe ist nicht falsch, da die SimpleDateFormatter diese Methode ebenfalls verwendet, aber sie ist etwas irreführend: Sie können keinen anderen Datumsformatierer injizieren, um den rollenden Dateiapplikator so zu arbeiten, wie Sie möchten.

Wenn Sie wirklich Rolle-für-Woche-Funktion benötigen, dann wäre der einfachste Weg, von der RollingFileAppender abzuleiten und überschreiben Sie die AdjustFileBeforeAppend() Methode. Habe das nicht getestet, aber das sollte es tun.

2

Ich habe meine jede Woche rollen. Sie müssen Ihr Datumsformat auf den Tag des Monats einstellen, um eindeutige Dateinamen zu generieren.

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

ich konfrontiere auch das gleiche Problem, die Logging-Datei wöchentlich zu rollen, indem das Verfahren von GLM-Lösung zu testen, irgendwie ist es nicht von der Version von log4net arbeiten (1.2.15.0), aber durch seine Antwort inspiriert, und den Quellcode zu studieren, ich habe eine Lösung aus der Protokolldatei mit Namen pro Woche zu erzeugen (wie am Sonntag Datum genannt)

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

und meinen Ausschnitt aus dem 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> 
Verwandte Themen