es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Apache log4j: Retención de registros de 3 días con rotación diaria.

En cualquier momento, quiero que mis archivos de registro sean así: mylog.log, mylog.log.1, mylog.log.2, reflejando los registros de hoy, los registros de ayer y los registros del día antes de ayer, respectivamente. Esto debe lograrse a través de Apache log4j/log4j-extras (v1.2.17), a través de código (sin configuración XML).

Sin embargo, el registro inicializado a continuación parece sobrescribir mylog.log todos los días. ¿Qué estoy haciendo mal?

private static Logger fileLogger() {
    TimeBasedRollingPolicy trigPolicy = new TimeBasedRollingPolicy();
    trigPolicy.setFileNamePattern("mylog.log" + ".%d");
    trigPolicy.setActiveFileName("mylog.log" );
    trigPolicy.activateOptions();
    FixedWindowRollingPolicy rollPolicy = new FixedWindowRollingPolicy();
    rollPolicy.setFileNamePattern("mylog.log" + ".%i");
    rollPolicy.setActiveFileName("mylog.log" );
    rollPolicy.setMaxIndex(3);
    rollPolicy.setMinIndex(1);
    rollPolicy.activateOptions();
    RollingFileAppender appender = new RollingFileAppender();
    appender.setFile("./mylog.log");
    appender.setLayout(new PatternLayout("[%d{yyyy.MM.dd::HH:mm:ss}] %-5p: %m%n"));
    appender.setThreshold(Level.DEBUG);
    appender.setAppend(true);
    appender.setRollingPolicy(rollPolicy);
    appender.setTriggeringPolicy(trigPolicy);
    appender.activateOptions();
    Logger logger = LogManager.getLogger(Foo.class);
    logger.addAppender(appender);
    return logger;
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema con el registrador es que no está estableciendo los valores apropiados para el método setActiveFileName de los objetos TimeBasedRollingPolicy y FixedWindowRollingPolicy. El método setActiveFileName establece el nombre de archivo con el que la política debería comenzar. Por lo tanto, en este caso, las políticas comienzan con el mismo nombre de archivo todos los días, y por eso se sobrescribe el archivo.

    Para solucionar este problema, puedes modificar los métodos setActiveFileName de la siguiente manera:

    private static Logger fileLogger() {
        TimeBasedRollingPolicy trigPolicy = new TimeBasedRollingPolicy();
        trigPolicy.setFileNamePattern("mylog.log" + ".%d");
        //establecer el log de ayer como archivo activo
        trigPolicy.setActiveFileName("mylog.log." + new SimpleDateFormat("yyyy-MM-dd").format(System.currentTimeMillis() - (24 * 60 * 60 * 1000)));
        trigPolicy.activateOptions();
        FixedWindowRollingPolicy rollPolicy = new FixedWindowRollingPolicy();
        rollPolicy.setFileNamePattern("mylog.log" + ".%i");
        //establecer el log de anteayer como archivo activo
        rollPolicy.setActiveFileName("mylog.log." + new SimpleDateFormat("yyyy-MM-dd").format(System.currentTimeMillis() - (48 * 60 * 60 * 1000)));
        rollPolicy.setMaxIndex(3);
        rollPolicy.setMinIndex(1);
        rollPolicy.activateOptions();
        RollingFileAppender appender = new RollingFileAppender();
        appender.setFile("./mylog.log");
        appender.setLayout(new PatternLayout("[%d{yyyy.MM.dd::HH:mm:ss}] %-5p: %m%n"));
        appender.setThreshold(Level.DEBUG);
        appender.setAppend(true);
        appender.setRollingPolicy(rollPolicy);
        appender.setTriggeringPolicy(trigPolicy);
        appender.activateOptions();
        Logger logger = LogManager.getLogger(Foo.class);
        logger.addAppender(appender);
        return logger;
    }
    

    En este registrador modificado, estamos estableciendo el log de ayer como el archivo activo para TimeBasedRollingPolicy y el log de anteayer como el archivo activo para FixedWindowRollingPolicy. Esto asegurará que el archivo de registro correcto esté activo y que los archivos de registro no se sobrescriban todos los días.

Comments are closed.