Log4j2版本2.11.0 / 2.11.1在Java 8应用程序中可以正常运行,但在Java 11中则不能正常运行
这是log4j2.xml的示例:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Properties>
<Property name="log-path">C:\\MyTestXXXX\\EnterpriseLogs</Property>
</Properties>
<Appenders>
<RollingFile name="MyTestOnly" fileName="${log-path}\ServerLog.log" filePattern="${log-path}\ServerLog_%d{yyyy-MM-dd}_%i.log" append="true">
<PatternLayout>
<Pattern>[#%d{HH:mm:ss}|%p|%m#]%n</Pattern>
</PatternLayout>
<Policies>
<CronTriggeringPolicy schedule="0 0 0 * * ?" evaluateOnStartup="true"/>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy/>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="OnlyLOG" additivity="true">
<AppenderRef ref="MyTestOnly" level="ALL" />
<Logger>
<Root level="ALL" />
</Loggers>
</Configuration>
在Java源代码中,我这样做: 导入org.apache.logging.log4j。*; 导入org.apache.logging.log4j.core.Logger;
...
// Get org.apache.logging.log4j.core.Logger
Logger logger = (Logger) LogManager.getLogger("OnlyLOG");
logger.log(Level.forName("INFO", 600), "Log this text now!", new Exception("xxxxxx"));
在Java 8中运行,我可以看到serverLog.log具有内容,这很好。 在Java 11中运行,没有日志。
通过进一步的研究(调试),我发现这一行很有趣:
Logger logger = (Logger) LogManager.getLogger("OnlyLOG");
执行后,在Java 8中,记录器类似于“ 2f333739中的ALL”,并且记录很好。 但是在Java 11中,记录程序类似“ 2f333739中的错误”,并且没有日志。显然,级别变为“错误”,而不是“全部”。
因此,我在Java 11中尝试了此方法:
Level loggerLevel = logger.getLevel(); // Obviously it is ERROR level
logger.log(loggerLevel, "Log this text now!", new Exception("xxxxxx"));
日志发生在控制台中(可能通过Root),而不是在Log4j2.xml中为Logger OnlyLOG配置的ServerLog.log中。
那么,是什么引起Java 8和Java 11之间的级别差异?换句话说,应该进行哪些修改,以便在Java 11中,日志仍然可以与Java 8中的日志相同地工作?
答案 0 :(得分:0)
问题已解决。这是原因。 我添加了一个新的Eclipse IDE来运行Java 11,添加项目时,我将lib文件夹添加到类路径中,因为log4j2.xml位于lib文件夹中。现在,我再次检查了IDE配置,发现lib文件夹不在类路径中。第二次尝试后,配置正常,日志记录变得正常。
我通过在Eclipse IDE中添加一个全新的项目进行了第二次测试。有趣的是,在将lib文件夹添加到类路径时,确实我不得不尝试两次,因为第一次没有添加它。顺便说一句,该计算机运行Windows10。使用Windows 7中运行的计算机时不会发生这种情况。
无论如何,Log4j2在Java 8和Java 11中都能正常工作。