我在我的应用程序中使用 Log4j2,它似乎加载和初始化得很好。 控制台被登录,2 个指定的文件附加程序创建各自的文件,但这些文件保持为空!
我的配置有问题吗?我启动 Log4j2 的方式是否错误?
这是配置:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="TRACE">
<Appenders>
<File name="file" fileName="${sys:logdir}ftm.log">
<PatternLayout pattern="%d{MM.dd.yyyy HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
<File name="file_error" fileName="${sys:logdir}ftm_error.log">
<PatternLayout pattern="%d{MM.dd.yyyy HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%d{MM.dd.yyyy HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="ALL">
<AppenderRef ref="file" level="ALL"/>
<AppenderRef ref="STDOUT" level="ALL"/>
</Root>
<Logger name="FTM" level="ALL" additivity="true">
<AppenderRef ref="file_error" level="ERROR"/>
</Logger>
</Loggers>
</Configuration>
这是代码:
LoggerContext contextLogging = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
File file = new File("log4j2.xml");
if (file != null && file.isFile() && file.canRead()){
contextLogging.setConfigLocation(file.toURI());
}
在此初始化位之后,我开始在整个应用程序的各个点进行日志记录。
我怀疑您获取 LoggerContext 的调用导致 Log4j 初始化。您应该看到一条消息,说明正在使用默认配置。为什么不只使用 Configurator.initialize() 方法之一?
我也发现了同样的问题。这是重新配置的问题。 可能是 log4j 代码中的错误。
我改变
System.setProperty("myapp.log.dir", "/tmp/myapp");
URL logres = App.class.getClassLoader().getResource("log4j2_myapp.xml");
LoggerContext.getContext().setConfigLocation(logres.toURI());
在
System.setProperty("myapp.log.dir", "/tmp/myapp");
URL logres = App.class.getClassLoader().getResource("log4j2_myapp.xml");
Configurator.initialize("myapp", App.class.getClassLoader(), logres.toURI());
一切正常。
也许 LOG4J2 正在缓冲您的日志消息并稍后写入它们。 您是否尝试过关闭您的应用程序服务器? 这将强制将所有缓冲的消息写入文件。