2010-09-27 16 views
18

Estoy intentando establecer la ruta de apéndice de Logback mediante programación. (RollingFileAppender con FixedWindowRollingPolicy para ser exactos)Configuración de la ruta de Appender de Logback programáticamente

que estoy haciendo esto porque quiero permitir que mis usuarios para establecer la ruta de registro en un diálogo de preferencias (Eclipse RCP)

He intentado algo como esto, pero yo no cambia la ruta del registro de lo que se define en el fichero de configuración:

Logger logback_logger = (ch.qos.logback.classic.Logger)LoggerFactory 
    .getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); 
RollingFileAppender<ILoggingEvent> rfappender = 
    (RollingFileAppender<ILoggingEvent>)logback_logger.getAppender("FILE"); 
rfappender.setFile(newFile); 
FixedWindowRollingPolicy rollingPolicy = 
    (FixedWindowRollingPolicy)rfappender.getRollingPolicy(); 
rollingPolicy.setFileNamePattern(newPattern); 

Respuesta

13

Usando las propiedades del sistema y volver a cargar el archivo de configuración parece más limpio:

cambio el archivo logback.xml:

<file>${log_path:-}myfile.log</file> 
.... 
<FileNamePattern>${log_path:-}myfile.%i.log</FileNamePattern> 

Esto establecerá la ubicación predeterminada para el directorio de trabajo. A continuación, utilice:

System.setProperty("log_path", my_log_path); 

//Reload: 
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
ContextInitializer ci = new ContextInitializer(lc); 
lc.reset(); 
try { 
    //I prefer autoConfig() over JoranConfigurator.doConfigure() so I wouldn't need to find the file myself. 
    ci.autoConfig(); 
} catch (JoranException e) { 
    // StatusPrinter will try to log this 
    e.printStackTrace(); 
} 
StatusPrinter.printInCaseOfErrorsOrWarnings(lc); 
+2

El uso del ContextInitializer es bastante incorrecto. Ver mi respuesta para el enfoque correcto. – Ceki

+1

cosas geniales! Algo que he cambiado: uso lc.putProperty ("log_path", my_log_path) en lugar de System.setProperty. Se ve mejor desde 0 globales utilizados. – Sasha

5

Si examina el código Logback, he encontrado una solución:

rollingPolicy.stop(); 
rfappender.stop(); 
rollingPolicy.start(); 
rfappender.start(); 

Esto hace que Logback use las nuevas definiciones. Sin embargo, todavía se siente como una solución.

26

Una vez que configure su programación appender, es necesario invocar su método start(). Si el appender tiene subcomponentes, primero invoque start() en los subcomponentes. A continuación, agregue el appender al registrador de su elección.

Aquí se muestra un ejemplo:

import ch.qos.logback.classic.Logger; 
import ch.qos.logback.classic.encoder.PatternLayoutEncoder; 
import ch.qos.logback.core.rolling.FixedWindowRollingPolicy; 
import ch.qos.logback.core.rolling.RollingFileAppender; 
import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy; 
import ch.qos.logback.core.util.StatusPrinter; 
import org.slf4j.LoggerFactory; 
import ch.qos.logback.classic.LoggerContext; 

public class Main { 
    public static void main(String[] args) { 
    LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); 

    RollingFileAppender rfAppender = new RollingFileAppender(); 
    rfAppender.setContext(loggerContext); 
    rfAppender.setFile("testFile.log"); 
    FixedWindowRollingPolicy rollingPolicy = new FixedWindowRollingPolicy(); 
    rollingPolicy.setContext(loggerContext); 
    // rolling policies need to know their parent 
    // it's one of the rare cases, where a sub-component knows about its parent 
    rollingPolicy.setParent(rfAppender); 
    rollingPolicy.setFileNamePattern("testFile.%i.log.zip"); 
    rollingPolicy.start(); 

    SizeBasedTriggeringPolicy triggeringPolicy = new ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy(); 
    triggeringPolicy.setMaxFileSize("5MB"); 
    triggeringPolicy.start(); 

    PatternLayoutEncoder encoder = new PatternLayoutEncoder(); 
    encoder.setContext(loggerContext); 
    encoder.setPattern("%-4relative [%thread] %-5level %logger{35} - %msg%n"); 
    encoder.start(); 

    rfAppender.setEncoder(encoder); 
    rfAppender.setRollingPolicy(rollingPolicy); 
    rfAppender.setTriggeringPolicy(triggeringPolicy); 

    rfAppender.start(); 

    // attach the rolling file appender to the logger of your choice 
    Logger logbackLogger = loggerContext.getLogger("Main"); 
    logbackLogger.addAppender(rfAppender); 

    // OPTIONAL: print logback internal status messages 
    StatusPrinter.print(loggerContext); 

    // log something 
    logbackLogger.debug("hello"); 
    } 
} 

El código anterior es la expresión programática de las medidas adoptadas por el configurador XML del logback, es decir, Joran, cuando se analiza el archivo RollingFixedWindow.xml.

+4

(Es un poco incómodo estar en desacuerdo contigo sobre el inicio de sesión, pero) esto no es lo que estoy tratando de hacer: quiero configurar mi registrador con XML, y solo cambiar la ubicación por código. De esta forma, los usuarios avanzados pueden controlar las propiedades de registro detalladas, y los usuarios noveles usan la interfaz de usuario. Reiniciar el appender por código funciona; Al usar las propiedades del sistema y ContextInitializer funciona mejor y está menos codificado, ¿por qué es incorrecto? – yshalbar

+0

¿Este enfoque sigue siendo válido con lanzamientos recientes de Logback? –

+0

El enlace a 'RollingFixedWindow.xml' está roto –

Cuestiones relacionadas