为什么 ConfigurationBuilder API 不创建 Logger?

Why the ConfigurationBuilder API does not create a Logger?

我正在尝试使用 spring 引导应用程序中的 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)

它应该 return 我 true.But 它 return 是假的。

以上代码可能存在什么问题。

在一些调试中,我发现 ctx.hasLogger 进入 loggerRegistry 以查找带有作为参数提供的 NAME 的记录器是否存在并且它没有找到它,所以它 return是假的。 我认为永远不会创建自定义记录器,这就是为什么 ctx.hasLogger() returns false.

此外,我还没有明确使用 log4j2 的任何配置文件。 当 spring 引导应用程序运行时,它会考虑自己的 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>

我终于找到了问题的解决方案 facing.The 问题出在配置开始时。

最初,LoggerContext 以找到的默认配置(spring 引导)开始,即当我们执行 ctx.start().

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

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

此后 ctx.getLogger(loggerName) 足以 return 具有指定配置的记录器。 您可以通过在 returned 记录器上调用 getLevel()isAdditive() 来验证它以匹配您的配置。

感谢@samabcde,他的建议有助于达成最终解决方案。