如何在运行时以编程方式添加Log4J2追加器?
是否可以使用 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中,以方便编程配置。
新的 API 允许用户构造组件定义。使用此API,无需直接使用实际的配置对象(如LoggerConfig和FileAppender),这需要很多关于Log4j如何在后台工作的知识。组件定义将添加到 ConfigurationBuilder 中,一旦收集了所有定义,就会构造所有实际的配置对象(如记录器和追加器)。它感觉有点像 XML 配置语法,只不过您正在编写 Java 代码。ConfigurationBuilder
请注意,新 API 允许用户代码创建新配置或完全替换现有配置。如果您的用例不同,并且您希望在 Log4j 启动后以编程方式修改(而不是替换)现有配置,则需要使用实际的配置对象。在这种情况下,请参阅本手册的初始化后以编程方式修改当前配置部分。ConfigurationBuilder
编辑:对于 log4j2 的最新版本,请参阅 https://stackoverflow.com/a/33472893/1899566。
我得到的印象是他们不希望你这样做,但这对我有用:
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 {
//...
}