我正在尝试在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>
答案 0 :(得分:1)
最后,我能够找到所面临问题的解决方案。问题出在配置开始时。
最初,LoggerContext从发现的默认配置开始(春季启动),即我们执行ctx.start()
时。
但是要使我们的配置生效,我们需要从我们的配置开始上下文,即 修改代码如下:
Configuration configuration = builder.build();
ctx.start(configuration);
此ctx.getLogger(loggerName)
运行良好,足以返回具有指定配置的Logger。
然后,您可以通过在返回的记录器上调用getLevel()
或isAdditive()
来进行验证,以匹配您的配置。
由于@samabcde的建议有助于最终解决方案。