2013-03-15 94 views
26

是否可以使用XML配置中的规范以编程方式添加Log4J2 appenders?如何在运行时以编程方式添加Log4J2 appenders?

我打算把它定义都在log4j2.xml,然后从中挑选追加程序situationally这样的(不会编译):

if (arg[0].equals("log")) { 
    Logger.getLogger("loggerNameFromXMLConfig").addAppender("appenderNameFromXMLConfig"); 
} else { 
    //... 
} 
+3

这几乎不是重复的,因为它意味着是一个log4j2问题。链接的问题涉及到log4j1(它甚至不公开与log4j2相同的方法)和slf4j。 – 2013-03-19 12:00:10

+1

我不确定那些关闭这个问题的人知道它实际上是什么。 – 2013-04-28 20:06:16

+0

现在,作为解决方法,我删除了log4j2并迁移到允许从XML配置动态构建的Log4J(“Log4J1”)。 – 2013-05-30 16:08:37

回答

15

编辑:为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 { 
    //... 
} 
+0

很漂亮! :) – 2013-08-01 04:56:54

+0

谢谢 - 我用它 - https://codingcraftsman.wordpress.com/2015/04/28/log4j2-mocking-with-mockito-and-junit/ – 2015-04-28 19:50:23

18

已经有很多请求支持更好的Log4j的编程配置2.对不起,花了这么长时间。从Log4j 2.4起,API被添加到log4j-core以便于programmatic configuration

新的ConfigurationBuilder API允许用户构建组件定义。使用这个API,不需要直接处理需要大量关于Log4j如何工作的知识的实际配置对象(如LoggerConfig和FileAppender)。组件定义被添加到ConfigurationBuilder中,并且一旦收集完所有的定义,所有的实际配置对象(如Logger和Appender)都被构造。它感觉有点像XML配置语法,只是您正在编写Java代码。

请注意,新的ConfigurationBuilder API允许用户代码创建新配置或完全替换现有配置。如果您的用例不同,并且您想在Log4j启动后以编程方式修改(而不是替换)现有配置,那么您将需要使用实际配置对象。在这种情况下,请参阅手册的Programmatically Modifying the Current Configuration after Initialization部分。

相关问题