我刚开始使用 log4j2。我将它用于使用 RMI 的多个 JVM。我有两个问题。
我使用与应用程序相同的 CLASSPATH 启动 rmiregistry,因为它是自己的可执行文件。它启动时没有任何错误,但是一旦 RMI 客户端与其对话,rmiregistry 就会输出此错误:ERROR StatusLogger Log4j2 could not find a logging implementation。请将 log4j-core 添加到类路径中...但是 log4j-core jar 文件已经在 CLASSPATH 中,如果有问题,那么为什么应用程序也不输出此错误?
我正在使用带有 OnStartupTriggeringPolicy 和 SizeBasedTriggeringPolicy 的 RollingFile 附加程序。理论上在启动时我应该得到如下日志:
foo.log - 活动日志
foo.log.1 - 如果我在之前已经启动过
旧日志,则会滚动 foo.log.2 - 如果我已经多次启动过旧日志,则会滚动
但是当我第一次启动它时,它滚动了很多次,即使没有达到大小限制并且活动日志是应该滚动的。换句话说,我明白了:
foo.log
foo.log.1
foo.log.2
foo.log.3 - 活动日志
foo.log.4
配置文件(log4j2.xml)内容:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<!-- ********** APPENDERS *********** -->
<Appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="%d (%-4r) [%t] %-5p %c %x - %m%n"/>
</Console>
<RollingFile
name="FOO_OUT"
fileName="/foo/log/foo.log"
filePattern="/foo/log/foo.log.%i"
append="true">
<PatternLayout>
<Pattern>%d (%-4r) [%t] %-5p %c %x - %m%n</Pattern>
</PatternLayout>
<DefaultRolloverStrategy max="24" fileIndex="min"/>
<Policies>
<OnStartupTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<asyncLogger name="au.com" level="DEBUG">
<AppenderRef ref="FOO_OUT"/>
</asyncLogger>
<asyncRoot level="debug">
<AppenderRef ref="FOO_OUT"/>
</asyncRoot>
</Loggers>
</Configuration>
CLASSPATH 包含很多 jar,但与 lo4j2 相关的主要有:
/foo/lib/slf4j/slf4j-api-1.7.21.jar
/foo/lib/slf4j/jcl-over-slf4j-1.7.21.jar
/foo/lib/slf4j/log4j-slf4j-impl-2.5.jar
/foo/lib/log4j2/log4j-core-2.5.jar
/foo/lib/log4j2/log4j-api-2.5.jar
/foo/lib/log4j2/disruptor-3.3.4.jar