Search code examples
javalogginglogbackslf4j

Programmatically add appender in logback


I am trying to add an appender dynamically in logback. Here is my code.

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
PatternLayoutEncoder ple = new PatternLayoutEncoder();
ple.setPattern("%date %level [%thread] %logger{10} [%file:%line] %msg%n");
ple.setContext(lc);
ple.start();
FileAppender<ILoggingEvent> fileAppender = new FileAppender<ILoggingEvent>();
String logFile = "new.log";
fileAppender.setFile(logFile);
fileAppender.setEncoder(ple);
fileAppender.setContext(lc);
fileAppender.start();

ch.qos.logback.classic.Logger logbackLogger =
                (ch.qos.logback.classic.Logger)LoggerFactory.getLogger(ModuleMessageHandler.class);
logbackLogger.addAppender(fileAppender);
logbackLogger.setLevel(Level.DEBUG);
logbackLogger.setAdditive(false);

It works ok but works only for the specific logger on which the appender is added. Is there a way to get this to work for all loggers in the application? I am looking for a way to dynamically add and remove appenders.


Solution

  • This section of your code:

    LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    PatternLayoutEncoder ple = new PatternLayoutEncoder();
    ple.setPattern("%date %level [%thread] %logger{10} [%file:%line] %msg%n");
    ple.setContext(lc);
    ple.start();
    FileAppender<ILoggingEvent> fileAppender = new FileAppender<ILoggingEvent>();
    String logFile = "new.log";
    fileAppender.setFile(logFile);
    fileAppender.setEncoder(ple);
    fileAppender.setContext(lc);
    fileAppender.start();
    

    ... creates and starts the file appender.

    This section of your code ...

    ch.qos.logback.classic.Logger logbackLogger =
                    (ch.qos.logback.classic.Logger)LoggerFactory.getLogger(ModuleMessageHandler.class);
    logbackLogger.addAppender(fileAppender);
    logbackLogger.setLevel(Level.DEBUG);
    logbackLogger.setAdditive(false);
    

    ... associates the file appender with the logger instance for ModuleMessageHandler.

    If, instead, you want the file appender to be associated with all logger instances in your application then (as @BillO'Neil) suggested you must associate the file appender with the root logger:

    ch.qos.logback.classic.Logger logbackLogger =
                    (ch.qos.logback.classic.Logger)LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
    logbackLogger.addAppender(fileAppender);