java - Log4j2 LoggerContext 未更新

标签 java log4j2

我创建了一个自定义附加程序 (WAppender) 和一个过滤器 (WFilter),我想在运行时添加它们。 将它们添加到当前的 Configuration 似乎工作得很好,但调用 updateLoggers() 不会对 LoggerContext 产生影响。

初始配置是从log4j2.xml加载的。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration packages="logging.WFilter, logging.WAppender" status="warn">

    <Properties>
        <Property name="log-path">log</Property>
    </Properties>

    <Appenders>

        <Console name="console-log" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{dd/MMM/yyyy HH:mm:ss,SSS} - %p - %m%n"/>
        </Console>

        <File name="file-log" fileName="logs/app.log" append="false">
            <PatternLayout pattern="%d{dd/MMM/yyyy HH:mm:ss,SSS} - %p - %m%n"/>
        </File>

    </Appenders>

    <Loggers>
        <Root level="debug">
            <AppenderRef ref="console-log" level="debug"/>
            <AppenderRef ref="file-log" level="error"/>
        </Root>
    </Loggers>

</Configuration>

然后,我尝试按照 Programmatically Modifying the Current Configuration after Initialization中的描述修改配置。 .

private static final LoggerContext context = LoggerContext.getContext(false);
private static final Configuration config = context.getConfiguration();
public static void attatchAppender (AppenderData appenderData) {

        if (appenderData != null) {

            WAppender appender = appenderData.getAppender();
            WFilter filter = appenderData.getFilter();

            appender.start();
            config.addAppender(appender);

            AppenderRef ref = AppenderRef.createAppenderRef(appender.getName(), Level.DEBUG, filter);
            AppenderRef[] refs = new AppenderRef[] {ref};
            LoggerConfig loggerConfig = LoggerConfig.createLogger(false, Level.DEBUG,
                    "org.apache.logging.log4j", "true", refs, null, config, filter);

            loggerConfig.addFilter(filter);
            loggerConfig.addAppender(appender, Level.DEBUG, filter);
            config.addLogger("org.apache.logging.log4j", loggerConfig);

            context.updateLoggers();
            // context.updateLoggers(config); (does not work either)

            Map<String, Appender> map = config.getAppenders();
            for (String key : map.keySet()) {
                System.out.println(map.get(key).getName());
            }

            /*
            * Outputs:
            *   console-log
            *   file-log
            *   wLogger-0 (as expected)
            */

            for (Logger logger : context.getLoggers()) {
                map = logger.getAppenders();
                for (String key : map.keySet()) {
                    System.out.println(map.get(key).getName());
                }
            }

            /*
             * Outputs:
             *   console-log
             *   file-log
             *
             *   console-log
             *   file-log
             */


        }

如代码所示,Configuration 确实包含新添加的 wLogger-0,但 Context 不包含。

PS。 WAppenderWFilter 都经过测试并且可以工作(从配置文件初始化)。

最佳答案

通过获取 RootLogger 设法使其正常工作及其Configuration相反,将 WAppenderWFilter 添加到其中,然后使用新的 Configuration 更新记录器.

我可能遗漏了 Log4j 内部工作原理的一些内容。

这会将附加程序添加到所有记录器中,这正是我想要实现的目标。

    public static void attatchAppender (AppenderData appenderData) {

        if (appenderData != null) {

            WAppender appender = appenderData.getAppender();
            WFilter filter = appenderData.getFilter();

            Logger rootLogger = context.getRootLogger();
            LoggerConfig rootLoggerConfig = config.getRootLogger();
            rootLoggerConfig.addAppender(appender, Level.DEBUG, filter);
            config.addLogger(rootLogger.getName(), rootLoggerConfig);

            context.updateLoggers(config);

        }

    }

关于java - Log4j2 LoggerContext 未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57374133/

相关文章:

yaml - 什么是 YAML 中 log4j2 的示例默认配置文件?

java - 根据环境定义不同的log4j2.xml配置

java - Log4j2 Slf4j 问题 - 服务器启动时未创建记录器文件

elasticsearch - 更改log4j2.properties文件将导致Elasticsearch失败

java - 如何将服务器端 Jax-rs 调用与没有前缀的 native 文件混合?

java - Java中创建新线程有多少种方式?

java - 发送 JPA 包装器对象

java - 如何在 AWS Lambda 上运行使用 npm 的 Java 应用程序

java - DockerFile : RUN Pass arguments

java - Tomcat 8 中 DB2 的 Log4j jdbc appender