如何在运行时添加Log4J2追加程序编程?(How to add Log4J2 appenders

2019-07-21 18:13发布

是否有可能添加编程方式使用XML配置规格Log4J2追加程序?

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

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

Answer 1:

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


Answer 2:

已经有一些要求,以支持更好的编程配置的Log4j 2.对不起花了这么长时间。 作为Log4j的2.4,API加入到log4j的核心以便于编程配置 。

ConfigurationBuilder API允许用户构建组件定义 。 有了这个API,没有必要直接与实际配置对象(如LoggerConfig和FileAppender),需要对Log4j的引擎盖下是如何工作的很多知识的工作。 组件定义加入到ConfigurationBuilder,一旦所有的定义已收集所有的实际配置对象(如记录器和附加目的地)被构造。 这感觉有点像XML配置语法,除非你正在编写Java代码。

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



Answer 3:

我不知道,如果它是有用的:一个appender可以通过调用当前配置的addLoggerAppender方法被添加到记录器。 参考: http://logging.apache.org/log4j/2.x/manual/architecture.html



Answer 4:

正如我上面提到的,我不能让https://logging.apache.org/log4j/2.x/manual/customconfig.html#AddingToCurrent工作,至少不是我的方式,预计到(我的appender会从来没有发送到它的消息)。 我也终于跨过那对我的作品的模式绊倒 - 让我在运行时添加一个appender,并有附加器实际上更多的日志发送到它的消息。

编辑我删除从这里什么也没做一堆混乱的代码....

    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回似乎。 这没有任何意义......但因为工作,我累了的东西,应该是这么简单的浪费时间的....



Answer 5:

在Log4j2结构

        ---"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() - >将返回附加目的地在“配置”。 对我来说,这是一个错误

loggerConfig.getAppenderRefs() - >运作良好!!



文章来源: How to add Log4J2 appenders at runtime programmatically?