了解Java系统中的日志记录

时间:2014-09-16 18:21:42

标签: java logging intellij-idea log4j slf4j

我最近开始研究IntelliJ(Java 8)中的一个项目,其中我(基本上)编写了一个小型上传/下载客户端。它工作正常,但我完全不明白我的应用程序中的日志记录是如何工作的。 (请耐心等待,这是一个无数的问题,虽然我可以把事情搞得一团糟,但这对我来说没有意义,我想了解发生了什么。)

我正在使用的其中一个库正在利用底层Log4J的SLF4J。想象我会继续在我自己的应用程序中使用它。但是,当我试图添加:

compile 'org.slf4j:slf4j-log4j12:1.7.7'

到我的Gradle构建依赖项并运行我的应用程序,我收到异常:

SLF4J: Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError. 
SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.
Exception in thread "main" java.lang.ExceptionInInitializerError

从我的研究中,我了解问题是什么(创建一种递归参考),虽然我不明白为什么另一个图书馆使用图书馆会影响我的使用。看起来很奇怪。

无论如何,我转而使用slf4j-simple。这修复了上述问题,当我在IntelliJ中运行我的应用程序时,一切都很好。我看到了控制台中的日志记录(这就是我现在想要的),而这就是它。没有其他日志记录显示。

当事情变得非常奇怪(我的问题在哪里)是当我构建应用程序并将其部署到我的测试系统时,然后通过Windows命令中的小批量脚本继续在测试系统上运行它提示,我看到每个库的输出......除了我自己的。我的日志记录都没有在任何地方注册。

这对我来说完全没有意义,我想知道我不了解的日志记录结构是什么。最终,我不想看到其他库日志,但我想看看我自己的。 (而且,如果我可以在所有这些之上使用Log4J,+奖励积分,但这不是我的主要问题。)

(请注意,所有日志记录都处于INFO或更高级别。但是,即使我将所有内容记录为错误,当我从Windows控制台运行java -jar MyApp.jar时,我仍然看不到它们。)< / p>

1 个答案:

答案 0 :(得分:1)

如果使用log4j-over-slf4j.jar,则代码应使用log4j API。然后,除了slf4j apis之外,您还需要一个后端日志记录实现(显然不是log4j)。 slf4j只是一个立面;它没有提供自己的日志记录实现。

如果您使用slf4j-log4j12.jar,您的代码应使用slf4j API。然后,您使用log4j作为日志记录返回端(例如,您可以使用log4j.properties来配置日志记录)。

根据您收到的错误,我假设项目正在使用第一个选项。您可以查看其他代码以查看正在使用的日志API。如果项目使用的是log4j API,那么你也应该这样做。