为什么ConfigurationBuilder API不创建记录器?

时间:2019-12-23 08:00:24

标签: java spring-boot logging log4j2

我正在尝试在Spring Boot应用程序中使用ConfigurationBuilder API以编程方式创建log4j2记录器。 但是代码似乎无法正常工作。

以下是我正在尝试实现的代码段:

    String loggerName = "testLogger";
    final ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory.newConfigurationBuilder();

    final LoggerComponentBuilder loggerComp = builder.newLogger(loggerName, Level.ALL).addAttribute("additivity",
            false);

    builder.add(loggerComp);

    LoggerContext ctx = Configurator.initialize(builder.build());
    final Configuration config = ctx.getConfiguration();
    ctx.start();
    ctx.updateLoggers();
    System.out.println(ctx.hasLogger(loggerName));

我希望记录器将在LoggerContext中创建并使用

进行测试

ctx.hasLogger(loggerName)

应该返回true,但是返回false。

上面的代码可能是什么问题。

在一些调试中,我发现ctx.hasLogger进入loggerRegistry,以查找是否存在以名称作为参数提供的logger,并且找不到,因此返回false。 我认为从未创建过自定义记录器,因此ctx.hasLogger()返回false的原因。

此外,我没有为log4j2明确使用任何配置文件。 Spring Boot应用程序在运行时会考虑其自己的log4j2.xml,如下所示:

 <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN">
        <Properties>
            <Property name="LOG_EXCEPTION_CONVERSION_WORD">%xwEx</Property>
            <Property name="LOG_LEVEL_PATTERN">%5p</Property>
            <Property name="LOG_DATEFORMAT_PATTERN">yyyy-MM-dd         
 HH:mm:ss.SSS
            </Property>
            <Property name="CONSOLE_LOG_PATTERN">%clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{%pid}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
            <Property name="FILE_LOG_PATTERN">%d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} %pid --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
            </Properties>
        <Appenders>
            <Console name="Console" target="SYSTEM_OUT" follow="true">
                <PatternLayout pattern="${sys:CONSOLE_LOG_PATTERN}" />
            </Console>
        </Appenders>
        <Loggers>
            <Logger name="org.apache.catalina.startup.DigesterFactory" level="error" />
            <Logger name="org.apache.catalina.util.LifecycleBase" level="error" />
            <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
            <logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
            <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" />
        <Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error" />
        <Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
        <logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
        <Root level="info">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

1 个答案:

答案 0 :(得分:1)

最后,我能够找到所面临问题的解决方案。问题出在配置开始时。

最初,LoggerContext从发现的默认配置开始(春季启动),即我们执行ctx.start()时。

但是要使我们的配置生效,我们需要从我们的配置开始上下文,即 修改代码如下:

Configuration configuration = builder.build(); ctx.start(configuration);

ctx.getLogger(loggerName)运行良好,足以返回具有指定配置的Logger。 然后,您可以通过在返回的记录器上调用getLevel()isAdditive()来进行验证,以匹配您的配置。

由于@samabcde的建议有助于最终解决方案。