2008-09-18 25 views
55

Tengo la siguiente configuración, pero no he podido encontrar ninguna documentación sobre cómo establecer un máximo de archivos de copia de seguridad en el estilo de fecha y hora. Sé que puedes hacer esto con el estilo de balanceo de tamaño mediante el uso de maxSizeRollBackups.Log4Net: establecer archivos de copia de seguridad máximos en RollingFileAppender con Fecha de laminación

<appender name="AppLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="mylog.log" /> 
    <appendToFile value="true" /> 
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
    <rollingStyle value="Date" /> 
    <datePattern value=".yyMMdd.'log'" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d %-5p %c - %m%n" /> 
    </layout> 
</appender> 
+0

+1 exactamente lo que estaba buscando –

Respuesta

4

No estoy seguro exactamente de lo que necesita. A continuación se muestra un extracto de uno de mis archivos lo4net.config:

<appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> 
    <param name="File" value="App_Data\log"/> 
    <param name="DatePattern" value=".yyyy-MM-dd-tt&quot;.log&quot;"/> 
    <param name="AppendToFile" value="true"/> 
    <param name="RollingStyle" value="Date"/> 
    <param name="StaticLogFileName" value="false"/> 
    <param name="maxSizeRollBackups" value="60" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%r %d [%t] %-5p %c - %m%n"/> 
    </layout> 
    </appender> 
+1

No se sabe por qué el voto abajo. Se considera una buena forma de explicar por qué para que todos podamos aprender. – wcm

+3

parece No entiendo el punto de la pregunta. maxSizeRollBackups no te permite, por ejemplo, eliminar archivos de más de 10 días de antigüedad. Creo que ese es el tipo de cosas que el OP está intentando conseguir. –

+0

Creo que estás en lo correcto, que es lo que OP quería. Estaba un poco confuso en cuanto a lo que estaba tratando de lograr en ese momento. Mi respuesta fue simple e intento mostrarle mi código. Todavía respondería las preguntas de la misma manera en un intento de ser útil, pero puedo ver de dónde vienes con el voto negativo. – wcm

40

No puede.

de log4net SDK Reference
RollingFileAppender Class

PRECAUCIÓN

Un número máximo de archivos de copia de seguridad al rodar en los límites de fecha/hora no es compatible.

+3

Actualizar está respaldado con maxSizeRollBackups: http://logging.apache.org/log4net/release/sdk/log4net.Appender.RollingFileAppender.MaxSizeRollBackups.html – schoetbi

+0

@schoetbi, todavía no está funcionando. Estoy haciendo un prototipo de esto y aunque maxSizeRollBackups está configurado en 3, más de 4 archivos respaldados. – Elangesh

+1

eso no es lo que hace maxSizeRollBackups, si un archivo para una fecha está bloqueado o es demasiado grande, se crea una copia de seguridad para la misma fecha. esto limita esos, no cuántos "días" de archivos se guardan, solo varios archivos para un día. –

11

Pasé algún tiempo investigando esto hace unos meses. v1.2.10 no admite la eliminación de archivos de registro anteriores en función de la fecha de caducidad. Está en la lista de tareas para la próxima versión. Tomé el código fuente y agregué la funcionalidad yo mismo, y la publiqué para otros si están interesados. El problema y el parche se pueden encontrar en https://issues.apache.org/jira/browse/LOG4NET-27.

+0

¿Cómo se puede usar esto? ¿tiene que descargar la fuente de log4net, agregar esto y luego volver a compilar y tomar el nuevo archivo de ensamblaje? – n00b

+0

hasta donde yo sé, sí –

34

A pesar de que no es soportado, aquí es cómo he manejado esta situación:

Esta es mi configuración:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <file value="C:\logs\LoggingTest\logfile.txt" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Composite" /> 
     <datePattern value="yyyyMMdd" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="1MB" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%date - %message%newline" /> 
     </layout> 
    </appender> 

al iniciar la aplicación hasta que hago:

XmlConfigurator.Configure(); 
var date = DateTime.Now.AddDays(-10); 
var task = new LogFileCleanupTask(); 
task.CleanUp(date); 

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 

using log4net; 
using log4net.Appender; 
using log4net.Config; 

    public class LogFileCleanupTask 
    { 
     #region - Constructor - 
     public LogFileCleanupTask() 
     { 
     } 
     #endregion 

     #region - Methods - 
     /// <summary> 
     /// Cleans up. Auto configures the cleanup based on the log4net configuration 
     /// </summary> 
     /// <param name="date">Anything prior will not be kept.</param> 
     public void CleanUp(DateTime date) 
     { 
      string directory = string.Empty; 
      string filePrefix = string.Empty; 

      var repo = LogManager.GetAllRepositories().FirstOrDefault(); ; 
      if (repo == null) 
       throw new NotSupportedException("Log4Net has not been configured yet."); 

      var app = repo.GetAppenders().Where(x => x.GetType() == typeof(RollingFileAppender)).FirstOrDefault(); 
      if (app != null) 
      { 
       var appender = app as RollingFileAppender; 

       directory = Path.GetDirectoryName(appender.File); 
       filePrefix = Path.GetFileName(appender.File); 

       CleanUp(directory, filePrefix, date); 
      } 
     } 

     /// <summary> 
     /// Cleans up. 
     /// </summary> 
     /// <param name="logDirectory">The log directory.</param> 
     /// <param name="logPrefix">The log prefix. Example: logfile dont include the file extension.</param> 
     /// <param name="date">Anything prior will not be kept.</param> 
     public void CleanUp(string logDirectory, string logPrefix, DateTime date) 
     { 
      if (string.IsNullOrEmpty(logDirectory)) 
       throw new ArgumentException("logDirectory is missing"); 

      if (string.IsNullOrEmpty(logPrefix)) 
       throw new ArgumentException("logPrefix is missing"); 

      var dirInfo = new DirectoryInfo(logDirectory); 
      if (!dirInfo.Exists) 
       return; 

      var fileInfos = dirInfo.GetFiles("{0}*.*".Sub(logPrefix)); 
      if (fileInfos.Length == 0) 
       return; 

      foreach (var info in fileInfos) 
      { 
       if (info.CreationTime < date) 
       { 
        info.Delete(); 
       } 
      } 

     } 
     #endregion 
    } 

El método secundario es una extensión sión método, básicamente envuelve string.format así:

/// <summary> 
/// Extension helper methods for strings 
/// </summary> 
[DebuggerStepThrough, DebuggerNonUserCode] 
public static class StringExtensions 
{ 
    /// <summary> 
    /// Formats a string using the <paramref name="format"/> and <paramref name="args"/>. 
    /// </summary> 
    /// <param name="format">The format.</param> 
    /// <param name="args">The args.</param> 
    /// <returns>A string with the format placeholders replaced by the args.</returns> 
    public static string Sub(this string format, params object[] args) 
    { 
     return string.Format(format, args); 
    } 
} 
+3

Vale la pena tener en cuenta que la 'Fecha de creación' podría no ser confiable debido a esto - http://stackoverflow.com/questions/2109152/unbelievable-strange-file-creation-time-problem – Iain

+1

También vale la pena señalar que esta clase solo funcionará correctamente si se cumplen las dos condiciones siguientes: 1) 'StaticLogFileName' se establece en ** true **. 2) 'preserveLogFileNameExtension' está establecido en ** falso **. –

+0

¿Qué es LogManager en este código? – techspider

0

Es bastante fácil de heredar de una appender log4net y añadir su propio decir método de reemplazo que lleva a cabo la limpieza de archivos. Sobreescribí OpenFile para hacer esto. Aquí hay un ejemplo de un apéndice de log4net personalizado para comenzar: https://stackoverflow.com/a/2385874/74585

1

Hace poco me encontré con esta necesidad al intentar limpiar los registros de registro basados ​​en un valor de configuración de maxAgeInDays pasado a mi servicio ... Como muchos tienen antes que yo, Estuve expuesto a la función 'Tunneling' de NTFS, que hace que el uso de FileInfo.CreationDate sea problemático (aunque ya he trabajado alrededor de esto también) ...

Como tenía un patrón para irme, decidí simplemente rodar mi propio método de limpieza ... Mi registrador se configura mediante programación, por lo que simplemente llamo a la siguiente después de que se haya completado la configuración de mi registrador ...

//......................... 
    //Log Config Stuff Above... 

    log4net.Config.BasicConfigurator.Configure(fileAppender); 
    if(logConfig.DaysToKeep > 0) 
     CleanupLogs(logConfig.LogFilePath, logConfig.DaysToKeep); 
} 

static void CleanupLogs(string logPath, int maxAgeInDays) 
{ 
    if (File.Exists(logPath)) 
    { 
     var datePattern = "yyyy.MM.dd"; 
     List<string> logPatternsToKeep = new List<string>(); 
     for (var i = 0; i <= maxAgeInDays; i++) 
     { 
      logPatternsToKeep.Add(DateTime.Now.AddDays(-i).ToString(datePattern)); 
     } 

     FileInfo fi = new FileInfo(logPath); 

     var logFiles = fi.Directory.GetFiles(fi.Name + "*") 
      .Where(x => logPatternsToKeep.All(y => !x.Name.Contains(y) && x.Name != fi.Name)); 

     foreach (var log in logFiles) 
     { 
      if (File.Exists(log.FullName)) File.Delete(log.FullName); 
     } 
    } 
} 

Probablemente no es el enfoque más bonita, pero trabajando bastante bien para nuestros propósitos ...

6

Para limitar el número de registros, no incluya el año o mes en el DatePattern, por ejemplo. datePattern value = "_ dd '.log '"

Esto creará un nuevo registro de cada día, y va a sobrescrito próximo mes

1

NLog, que se configura casi del mismo modo que Log4net (& se mantiene activa -. incluso tiene soporte para .NET Core), admite roll logs basado en la fecha.

Cuestiones relacionadas