2010-09-15 28 views
5

La chaîne DatePattern doit être quelque chose que le SimpleDateFormatterwill accept. Malheureusement, cela signifie que, hors de la boîte, cela ne signifie pas être en mesure de définir la limite d'un numéro de semaine. Il existe des moyens d'obtenir cette valeur en C#, mais il n'est pas évident que nous puissions étendre le SimpleDateFormatter ou fournir une implémentation différente de IDateFormatter et l'utiliser à la place (ou même dans un RollingFileAppender personnalisé). Alors, comment pouvons-nous obtenir un Log4Net RollingFileAppender pour rouler chaque semaine?Avoir une Log4Net RollingFileAppender définie pour rouler chaque semaine

Répondre

1

Ce n'est pas si simple. RollingFileAppender utilise DateTime.ToString() pour déterminer le "point de roulement". L'instruction de l'aide de log4net n'est pas fausse puisque la méthode SimpleDateFormatter utilise également cette méthode, mais elle est quelque peu trompeuse: vous ne pouvez pas injecter un formateur de date différent pour faire fonctionner l'appender de fichier tournant comme vous le souhaitez.

Si vous avez vraiment besoin d'une fonction de déroulement par semaine, le plus simple serait de dériver du RollingFileAppender et de surcharger la méthode AdjustFileBeforeAppend(). N'a pas testé cela, mais cela devrait faire l'affaire.

2

J'ai eu le mien roulant chaque semaine. Vous devez définir votre format de date pour inclure le jour du mois afin de générer des noms de fichiers uniques.

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

Je sont également confrontés à la même question à rouler l'hebdomadaire de fichiers de journalisation, en testant la méthode de la solution de GLM, il est en quelque sorte ne fonctionne pas sur la version de log4net (1.2.15.0), mais inspiré par sa réponse, et étudier le code source, j'ai fait une solution pour générer le fichier journal par nom par semaine (du nom que la date de dimanche)

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

et mon extrait du 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>