如何在运行时以编程方式添加Log4J2追加器?

2022-08-31 20:55:53

是否可以使用 XML 配置中的规范以编程方式添加 Log4J2 追加器?

我计划在log4j2中定义所有内容.xml然后像这样选择附加器(不会编译):

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

答案 1

有许多请求支持Log4j 2更好的编程配置。很抱歉花了这么长时间。从Log4j 2.4开始,API被添加到log4j-core中,以方便编程配置

新的 API 允许用户构造组件定义。使用此API,无需直接使用实际的配置对象(如LoggerConfig和FileAppender),这需要很多关于Log4j如何在后台工作的知识。组件定义将添加到 ConfigurationBuilder 中,一旦收集了所有定义,就会构造所有实际的配置对象(如记录器和追加器)。它感觉有点像 XML 配置语法,只不过您正在编写 Java 代码。ConfigurationBuilder

请注意,新 API 允许用户代码创建新配置或完全替换现有配置。如果您的用例不同,并且您希望在 Log4j 启动后以编程方式修改(而不是替换)现有配置,则需要使用实际的配置对象。在这种情况下,请参阅本手册的初始化后以编程方式修改当前配置部分。ConfigurationBuilder


答案 2

编辑:对于 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 {
  //...
}

推荐