使用编程的方式在logback中添加appender

5
我正在尝试在logback中动态添加一个appender。这是我的代码。
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);

它可以正常工作,但仅适用于添加了appender的特定记录器。是否有一种方法可以使其适用于应用程序中的所有记录器?我正在寻找一种动态添加和删除appenders的方法。


2
你想获取根记录器。Logger root = (Logger)LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); - Bill O'Neil
1
这只是Logback,我没有看到任何SLF4J。 - Ghilteras
1个回答

15

你的代码中的这部分:

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

...将文件附加器与ModuleMessageHandler记录器实例相关联。

如果你希望文件附加器与应用中所有的记录器实例相关联,那么(如@BillO'Neil所建议的)你必须将文件附加器与根记录器相关联:

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

这里的setAdditive(false)是做什么用的? - Gurnard
1
setAdditive(true) 表示该 appender 被视为附加 appender。因此,日志消息可以在多个日志中看到。当 setAdditive(false) 时,它仅由此 appender 使用。 - user2209562

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接