我创建了一个自定义附加程序 (WAppender) 和一个过滤器 (WFilter),我想在运行时添加它们。
将它们添加到当前的 Configuration
似乎工作得很好,但调用 updateLoggers()
不会对 LoggerContext
产生影响。
初始配置是从log4j2.xml加载的。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration packages="logging.WFilter, logging.WAppender" status="warn">
<Properties>
<Property name="log-path">log</Property>
</Properties>
<Appenders>
<Console name="console-log" target="SYSTEM_OUT">
<PatternLayout pattern="%d{dd/MMM/yyyy HH:mm:ss,SSS} - %p - %m%n"/>
</Console>
<File name="file-log" fileName="logs/app.log" append="false">
<PatternLayout pattern="%d{dd/MMM/yyyy HH:mm:ss,SSS} - %p - %m%n"/>
</File>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="console-log" level="debug"/>
<AppenderRef ref="file-log" level="error"/>
</Root>
</Loggers>
</Configuration>
然后,我尝试按照 Programmatically Modifying the Current Configuration after Initialization中的描述修改配置。 .
private static final LoggerContext context = LoggerContext.getContext(false);
private static final Configuration config = context.getConfiguration();
public static void attatchAppender (AppenderData appenderData) {
if (appenderData != null) {
WAppender appender = appenderData.getAppender();
WFilter filter = appenderData.getFilter();
appender.start();
config.addAppender(appender);
AppenderRef ref = AppenderRef.createAppenderRef(appender.getName(), Level.DEBUG, filter);
AppenderRef[] refs = new AppenderRef[] {ref};
LoggerConfig loggerConfig = LoggerConfig.createLogger(false, Level.DEBUG,
"org.apache.logging.log4j", "true", refs, null, config, filter);
loggerConfig.addFilter(filter);
loggerConfig.addAppender(appender, Level.DEBUG, filter);
config.addLogger("org.apache.logging.log4j", loggerConfig);
context.updateLoggers();
// context.updateLoggers(config); (does not work either)
Map<String, Appender> map = config.getAppenders();
for (String key : map.keySet()) {
System.out.println(map.get(key).getName());
}
/*
* Outputs:
* console-log
* file-log
* wLogger-0 (as expected)
*/
for (Logger logger : context.getLoggers()) {
map = logger.getAppenders();
for (String key : map.keySet()) {
System.out.println(map.get(key).getName());
}
}
/*
* Outputs:
* console-log
* file-log
*
* console-log
* file-log
*/
}
如代码所示,Configuration
确实包含新添加的 wLogger-0,但 Context
不包含。
最佳答案
通过获取 RootLogger
设法使其正常工作及其Configuration
相反,将 WAppender 和 WFilter 添加到其中,然后使用新的 Configuration
更新记录器.
我可能遗漏了 Log4j 内部工作原理的一些内容。
这会将附加程序添加到所有记录器中,这正是我想要实现的目标。
public static void attatchAppender (AppenderData appenderData) {
if (appenderData != null) {
WAppender appender = appenderData.getAppender();
WFilter filter = appenderData.getFilter();
Logger rootLogger = context.getRootLogger();
LoggerConfig rootLoggerConfig = config.getRootLogger();
rootLoggerConfig.addAppender(appender, Level.DEBUG, filter);
config.addLogger(rootLogger.getName(), rootLoggerConfig);
context.updateLoggers(config);
}
}
关于java - Log4j2 LoggerContext 未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57374133/