是否可以按照XML配置规范以编程方式添加Log4J2附加器?
我计划在log4j2.xml中定义所有内容,然后像这样根据情况选择附加器(不会编译):
if (arg[0].equals("log") ) {
Logger.getLogger("loggerNameFromXMLConfig").addAppender("appenderNameFromXMLConfig");
} else {
//...
}
是否可以按照XML配置规范以编程方式添加Log4J2附加器?
我计划在log4j2.xml中定义所有内容,然后像这样根据情况选择附加器(不会编译):
if (arg[0].equals("log") ) {
Logger.getLogger("loggerNameFromXMLConfig").addAppender("appenderNameFromXMLConfig");
} else {
//...
}
有很多请求支持更好的Log4j 2程序配置。对不起,花费了这么长时间才推出。从Log4j 2.4开始,API被添加到log4j-core以便于程序化配置。
新的ConfigurationBuilder
API允许用户构建组件定义。使用此API,无需直接处理实际配置对象(如LoggerConfig和FileAppender),因为这需要了解Log4j在底层是如何工作的。组件定义添加到ConfigurationBuilder中,一旦收集了所有定义,所有实际配置对象(如Loggers和Appenders)都将被构建。它感觉有点像XML配置语法,只是你写的是Java代码。
请注意,新的ConfigurationBuilder
API允许用户代码创建一个新的配置或完全替换现有的配置。如果您的用例不同,并且希望在Log4j启动后以编程方式修改(而不是替换)现有配置,则需要处理实际配置对象。在这种情况下,请参阅手册中的在初始化后编程修改当前配置部分。
logger.addAppender(appender);
就可以了... - Amerousful编辑:对于最新版本的log4j2,请查看此处:https://dev59.com/vmUp5IYBdhLWcg3wNFar#33472893
我觉得他们不想让你这样做,但这对我起作用:
if (arg[0].equals("log") ) {
org.apache.logging.log4j.Logger logger
= org.apache.logging.log4j.LogManager.getLogger("loggerNameFromXMLConfig");
org.apache.logging.log4j.core.Logger coreLogger
= (org.apache.logging.log4j.core.Logger)logger;
org.apache.logging.log4j.core.LoggerContext context
= (org.apache.logging.log4j.core.LoggerContext)coreLogger.getContext();
org.apache.logging.log4j.core.config.BaseConfiguration configuration
= (org.apache.logging.log4j.core.config.BaseConfiguration)context.getConfiguration();
coreLogger.addAppender(configuration.getAppender("appenderNameFromXMLConfig"));
} else {
//...
}
LoggerContext lc = (LoggerContext) LogManager.getContext(false);
FileAppender fa = FileAppender.newBuilder().withName("mylogger").withAppend(false).withFileName(new File(outputDirectory, "ConsoleOutput.txt").toString())
.withLayout(PatternLayout.newBuilder().withPattern("%-5p %d [%t] %C{2} (%F:%L) - %m%n").build())
.setConfiguration(lc.getConfiguration()).build();
fa.start();
lc.getConfiguration().addAppender(fa);
lc.getRootLogger().addAppender(lc.getConfiguration().getAppender(fa.getName()));
lc.updateLoggers();
对我来说一个关键的点,是直接调用addAppender并传入你的 appender 是不起作用的,但是通过名称请求你的 appender 可以。虽然这没有意义...但既然它有效了,我已经厌倦了在本应如此简单的事情上浪费时间。
---"Config"---
Appenders
Appender(0)
Console
Appender(1)
File
LoggerConfigs
-- LoggerConfig(0)
-- LoggerConfig(1)
-- LoggerConfig(2)
----"LoggerConfig"----
- AppenderRefs
-- AppenderRef(0)
-- Name Console
-- Level : DEBUG
- Appenders
-- Appender(0)
-- Name Console
-- Level : DEBUG
- Level -- ALL
loggerConfig.getAppenders() --> 将返回“Config”中的Appenders。对我来说,这是一个错误。
loggerConfig.getAppenderRefs() --> 正常工作!