4

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.

Eugene
  • 117,005
  • 15
  • 201
  • 306
Maruthi
  • 460
  • 4
  • 11

1 Answers1

12

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);
glytching
  • 44,936
  • 9
  • 114
  • 120
  • what does setAdditive(false) do here? – Gurnard May 08 '19 at 08:17
  • The setAdditive(true) means that the appender is treated as an additional appender. Thus the log message can be seen in multiple logs. When setAdditive(false) it only is used by this appender. – user2209562 Jan 31 '23 at 14:17