2010-02-18 30 views
11

INTENCIÓN:log4net - Eliminar archivos viejos rodando por fecha

a) Quiero que mis registros para ser enrollados por fecha en el siguiente formato de archivo aaaa-MM-dd.txt.

b) Además de esto quiero eliminar archivos antiguos que están fuera del rango maxSizeRollBackups.

CAUTION A maximum number of backup files when rolling on date/time 
    boundaries is not supported. [RollingFileAppender spec][1] 

SOLUCIÓN

para a) es suficiente para hacer la configuración

<appender name="FileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="logs\" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Date" /> 
    <maxSizeRollBackups value="30" /> 
    <datePattern value="yyyy-MM-dd'.txt'" /> 
    <staticLogFileName value="false" /> 
    <layout type="log4net.Layout.XmlLayoutSchemaLog4j"/> 
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
</appender> 

para b) es la herencia de RollingFileAppender + borrar cosas de la única manera de lograr esto ?

+0

Aquí es Precaución -> http://logging.apache.org/log4net/release/ sdk/log4net.Appender.RollingFileAppender.html – ruslander

Respuesta

7

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.

+2

¿Así que agregó el parche en 2005 y todavía no se ha aceptado? –

+1

(a decir verdad, no es un proyecto muy activo) La explicación de por qué es https://issues.apache.org/jira/browse/LOG4NET-27?focusedCommentId=13248077&page=com.atlassian.jira.plugin.system .issuetabpanels: comment-tabpanel # comment-13248077 –

1

Parece que la versión de parche 4 de RollingFileAppenderer proporcionada aquí https://issues.apache.org/jira/secure/attachment/12565940/RollingFileAppender.zip funciona bien con un pequeño cambio: en la línea 1286, reemplace ". *" Con "*".

Para ello se puede utilizar la siguiente configuración:

<appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> 
    <file type="log4net.Util.PatternString" value="MyProduct.log" /> 
    <param name="DatePattern" value="'_'yyyy-MM-dd"/> 
    <param name="AppendToFile" value="true"/> 
    <param name="RollingStyle" value="Date"/> 
    <param name="StaticLogFileName" value="false"/> 
    <param name="MaxDateRollBackups" value="3" /> 
    <param name="preserveLogFileNameExtension" value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <param name="ConversionPattern" value="%r %d [%t] %-5p %c - %m%n"/> 
    </layout> 
</appender> 
0

Teniendo en cuenta que más de una década pasó y todavía no está soportado, he optado por la siguiente solución de primordial RollingFileAppender con la funcionalidad requerida:

public class RollingDateAppender : RollingFileAppender { 
    public TimeSpan MaxAgeRollBackups { get; set; } 

    public RollingDateAppender() 
    : base() { 
    PreserveLogFileNameExtension = true; 
    StaticLogFileName = false; 
    } 

    protected override void AdjustFileBeforeAppend() { 
    base.AdjustFileBeforeAppend(); 

    string LogFolder = Path.GetDirectoryName(File); 
    var CheckTime = DateTime.Now.Subtract(MaxAgeRollBackups); 
    foreach (string file in Directory.GetFiles(LogFolder, "*.log")) { 
     if (System.IO.File.GetLastWriteTime(file) < CheckTime) 
     DeleteFile(file); 
    } 
    } 

} 

configuración es tan simple como con la clase original:

roller = new RollingDateAppender { 
    AppendToFile = true, 
    File = ...; 
    MaxAgeRollBackups = TimeSpan.FromDays(7), 
    RollingStyle = RollingFileAppender.RollingMode.Date, 
    ... 
}; 
roller.ActivateOptions(); 
BasicConfigurator.Configure(roller); 

Tenga en cuenta que buscar archivos *.log en el directorio de registro solo tiene sentido si se usa PreserveLogFileNameExtension o DatePattern para incluir la extensión al final del nombre de archivo. Si necesita un esquema de nombres diferente, modifíquelos en sincronización.

(he usado la versión 2.0.8 de log4net, las versiones anteriores podrían no permiten la función necesaria para ser anulado.)

Cuestiones relacionadas