【发布时间】:2020-01-23 06:36:06
【问题描述】:
我们使用一个相当简单的 log4j2.xml 配置文件来记录到标准输出。但是,在某些情况下,我们希望在应用程序启动后以编程方式更改此配置,以使用在命令行上传递的日志文件。
为此我按照log4j2主页上的建议,写了如下方法
static void divertLogging(String logFile, Level level) {
ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();
AppenderComponentBuilder appenderBuilder
= builder.newAppender("File", "FILE").addAttribute("fileName", logFile).addAttribute("append", "false");
appenderBuilder.add(builder.newLayout("PatternLayout")
.addAttribute("pattern", "%d [%t] %-5level: %msg%n%throwable"));
builder.add(appenderBuilder);
builder.add(builder.newRootLogger(level).add(builder.newAppenderRef("File")));
try {
builder.writeXmlConfiguration(System.out);
} catch (IOException e) {
throw new ApplicationException(e);
}
BuiltConfiguration configuration = builder.build();
Configurator.initialize(configuration);
((LoggerContext)LogManager.getContext(false)).updateLoggers(configuration);
}
我们得到以下输出
<?xml version="1.0" ?>
<Configuration>
<Appenders>
<FILE name="File" fileName="test.log" append="false">
<PatternLayout pattern="%d [%t] %-5level: %msg%n%throwable"/>
</FILE>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
然后是日志消息
ERROR Attempted to append to non-started appender File
之后,日志继续输出到标准输出,所需的日志文件保持为空。
有人知道我做错了什么吗?
【问题讨论】:
-
根据this需要调用start()
-
我在寻找解决方案时也看到了该帖子。我的印象是 log4j2 负责启动附加程序;特别是,因为我只是在构建构建器,而不是对象本身。但是,在上述方法的最后一行之前添加一行
configuration.getAppender("logFile").start();似乎解决了问题... -
...但仅适用于同一类中的下一条日志语句。其他日志语句再次输出到标准输出...... :-(