为什么 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,他的建议有助于达成最终解决方案。
我正在尝试使用 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,他的建议有助于达成最终解决方案。