使用 logback,但不知何故 log4j 被初始化

Using logback, but somehow log4j getting initialized

我们的控制台应用程序正在使用 logback 进行日志记录。 类路径中有一个 logback.xml 文件。

日志记录在大多数平台(Linux、Windows、jdk7 或 jdk8)上按预期工作(通过 logback)。

但是,在使用 jdk6 的 Mac 上,当 运行 我们有时会看到应用程序时:

log4j:WARN No appenders could be found for logger (our.class.Here).
log4j:WARN Please initialize the log4j system properly.

似乎出于某种原因,log4j 被选择用于日志记录而不是 logback。 在our.class.Here我们通过slf4j登录:

private static final org.slf4j.Logger LOG = org.slf4j.LoggerFactory.getLogger(our.class.Here.class);

这是完整的类路径:

/path/etc/logback.xml:/path/lib/pdfbox-1.8.4.jar:/path/lib/fontbox-1.8.4.jar:/path/lib/jempbox-1.8.4.jar:/path/lib/jcl-over-slf4j-1.7.7.jar:/path/lib/bcprov-jdk15-1.45.jar:/path/lib/bcmail-jdk15-1.45.jar:/path/lib/xmlgraphics-commons-1.5.jar:/path/lib/icepdf-core-5.0.4.jar:/path/lib/jai-codec-1.1.3.jar:/path/lib/jai-core-1.1.3.jar:/path/lib/jewelcli-0.6.jar:/path/lib/commons-lang3-3.1.jar:/path/lib/commons-io-2.2.jar:/path/lib/logback-classic-1.1.0.jar:/path/lib/logback-core-1.1.0.jar:/path/lib/itext-2.1.7.jar:/path/lib/hibernate-validator-4.2.0.Final.jar:/path/lib/slf4j-api-1.7.5.jar

我们如何进一步排除故障以了解为什么选择 log4j 而不是 logback 进行日志记录?

感谢您的建议。

我在您的类路径中没有看到 log4j-over-slf4j...也许这就是您所缺少的以确保任何 log4j 相关代码通过正确的 slf4j 日志记录实现(logback)?

  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>log4j-over-slf4j</artifactId>
    <version>1.7.10</version>
  </dependency>

问题是 log4j.jar 在用户 Java 的扩展目录中:/Library/Java/Extensions

我们通过 运行 java 和 -verbose 发现了这一点,它指出了 log4j.jar 从哪里加载。

解决方法是在 运行 我们的应用程序时禁用扩展文件夹: export JAVA_OPTS=-Djava.ext.dirs=""

由于机器不是我们的,我们无法应用清理扩展目录的(更好的)永久解决方案。