【问题标题】:Using logback, but somehow log4j getting initialized使用 logback,但不知何故 log4j 被初始化
【发布时间】:2015-01-20 16:36:25
【问题描述】:

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

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

但是,在使用 jdk 6 的 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 进行日志记录?

感谢您的建议。

【问题讨论】:

  • 您是在独立运行应用还是在容器内运行?
  • 这是一个独立的控制台应用程序

标签: java logging log4j slf4j logback


【解决方案1】:

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

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

【讨论】:

  • 我们的应用程序正在使用 logback 进行日志记录。看来他们想要 log4j。
  • @SotiriosDelimanolis,是的,我知道,log4j-over-slf4j 就是这样做的。 Slf4j 将各种日志框架(JUL、JCL、Log4j 等)上的 API 桥接到 Slf4j,后者配置有单个“绑定”(在本例中为 logback)。您可以拥有多个网桥(JUL、JCL、Log4j -> Slf4j)和一个绑定(要使用的实际日志记录实现)。他还应该添加缺少的jul-to-slf4j
  • 在这里阅读slf4j.org/legacy.html 似乎应该使用log4j-over-slf4j 代替log4j.jar,这不在我们的类路径中。我误会了吗?稍后编辑:嗯,但这是一个好点,log4j 必须在类路径中的某个地方。 Perhalps 捆绑在其中一个库罐中。但是在这种情况下,我是否需要确保首先找到 log4j-over-slf4j.jar?
  • @Edi,这是正确的。 slf4j “桥接”第三方 jar 使用的 API,您无法控制,使用您不想要的东西(主要是 log4j、jcl、jul 日志记录)。您不需要包含 log4j 本身,而是包含 slf4j log4j 桥,这将确保引用 log4j 类的任何代码(可能是第三方)将通过 slf4j“桥接”。您需要做的就是将您想要的“桥”jar 添加到您的类路径
【解决方案2】:

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

我们通过使用-verbose 运行 java 发现了这一点,它指出了 log4j.jar 的加载位置。

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

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

【讨论】:

    猜你喜欢
    • 2012-12-28
    • 2011-05-22
    • 2012-09-04
    • 2017-11-11
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    相关资源
    最近更新 更多