2010-09-15 34 views
5

La cadena DatePattern debe ser algo que el SimpleDateFormatterwill accept.Tener un RollingFileAppender de Log4Net configurado para rodar semanalmente

Lamentablemente, esto significa que, de fábrica, esto no incluye la posibilidad de establecer el límite para que sea un número de semana. Hay formas de obtener este valor en C#, pero no es obvio que podamos extender el SimpleDateFormatter o proporcionar una implementación diferente de IDateFormatter y usar eso en su lugar (o incluso en un RollingFileAppender personalizado).

Entonces, ¿cómo podemos obtener un Log4Net RollingFileAppender para rodar semanalmente?

Respuesta

1

No es tan simple. El RollingFileAppender usa DateTime.ToString() para determinar el "punto de balanceo". La declaración de la ayuda de log4net no está mal, ya que el SimpleDateFormatter también utiliza este método, pero es un poco engañoso: no se puede inyectar un formateador de fecha diferente para que el apilador del archivo rodante funcione de la manera que desee.

Si realmente necesita la característica de rodar por semana, la forma más fácil sería derivar del RollingFileAppender y anular el método AdjustFileBeforeAppend(). No probé esto, pero eso debería ser el truco.

2

Tengo la mina rodando cada semana. Debe configurar su fecha para incluir el día del mes para generar nombres de archivo únicos.

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

también enfrentan el mismo problema a rodar el archivo de registro semanal, poniendo a prueba el método de resolución de GLM, por alguna razón no está trabajando en la versión de log4net (1.2.15.0), pero inspirado por su respuesta, y estudiar el código fuente, he hecho una solución para generar el archivo de registro por su nombre a la semana (llamado como la fecha del domingo)

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

y mi fragmento de la 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> 
Cuestiones relacionadas