pattern example java logging logback

java - example - logback pattern



ConfiguraciĆ³n de la ruta de Appender de Logback mediante programaciĆ³n (3)

Estoy tratando de establecer la ruta del apéndice de Logback programáticamente. ( RollingFileAppender con FixedWindowRollingPolicy para ser exactos)

Hago esto porque quiero permitir a mis usuarios establecer la ruta de registro en un cuadro de diálogo de preferencias (Eclipse RCP)

Intenté algo como esto, pero no cambio la ruta del registro de lo que está definido en el archivo 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);


Al mirar el código de Logback, encontré 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.


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

cambie el archivo logback.xml:

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

Esto establecerá la ubicación predeterminada en el directorio de trabajo. Entonces, usa:

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


Una vez que configura programáticamente su appender, necesita invocar su método start() . Si el appender tiene subcomponentes, invoque start() en los subcomponentes primero. A continuación, agregue el appender al registrador de su elección.

Aquí hay 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 los pasos tomados por el configurador XML del logback, es decir, Joran, cuando analiza el archivo RollingFixedWindow.xml .