被带有Spring和Hibernate的Java日志记录系统所困扰

2022-09-03 14:10:32

在部署我的Spring / Hibernate应用程序时,我收到以下与日志记录相关的警告:

log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.

令我惊讶的是缺乏来自Google / SO搜索的信息。唯一相关的是这个SO帖子 共享资源日志记录/ Log4j设置的问题 春季Webapp与tomcat 6

但是,这甚至超出了我的范围。有人可以澄清这里正在发挥作用的日志记录系统,或者向我指出有关此事的最近资源(有一些古老的Google搜索结果并不真正适用)。具体来说,我正在纠结的问题是:

  • commons-logging,log4j,slf4j和JCL之间的区别。我的理解是slf4j是一个包装器,而commons-logging和log4j是实际的实现。我不知道JCL适合在哪里。

  • 如何为Spring配置日志记录。在web.xml文件中,我需要log4j.properties文件还是log4j.xml文件?在WEB-INF中,它去了哪里?我的应用程序文本.xml文件中是否有任何内容?(对不起,但我需要从这里从零开始)。

  • 我在我的项目中使用Hibernate,包括通过Maven。似乎Hibernate使用slf4j-simple。我看到警告说我不能在类路径上同时拥有slf4j-simple和slf4j-log4j。我没有将slf4j-log4j作为依赖项,但Hibernate必须包含它。我该如何解决这个问题?我可以强制休眠改用log4j吗?

任何帮助将不胜感激。谢谢。


编辑:

感谢到目前为止的所有答案。我正在尝试这些建议。特别是春季网络应用程序呢?我看过侦听器和参数的示例,以及什么不放入web.xml文件中。这也是必需的吗?


答案 1
  • commons-loggingSLF4J 都是围绕其他日志记录实现的 API 包装器。SLF4J是两者中更现代的,而且功能更强大。Log4j是一个日志记录实现,几乎是事实上的标准。JUL(缩写)是 JRE 附带的(通常很糟糕的)日志记录实现。另一个日志实现是logback,它正在慢慢获得牵引力,但还没有普及。java.util.logging
  • log4j.properties并且是配置log4j的不同方法,两者都同样有效。使用哪一个取决于您,尽管某些应用程序服务器决定了其中之一。阅读 log4j 手册,了解如何配置它。log4j.xml
  • 如果Hibernate使用SLF4J作为其API,那就是Hibernate开发人员的选择。但是,您可以选择 SLF4J 将委派给哪个日志记录实现。同样,请阅读 slf4j 手册,了解如何选择您选择的实现。

是的,这一切都相当令人困惑。给定一个开放的选择,SLF4J和Logback是最强大的组合,但你通常不会得到一个开放的选择。不同的框架(如Hibernate和Spring)可能会使用不同的日志记录API,通常是commons-logging或SLF4J,但你可以让所有这些API最终记录到相同的底层实现(通常是log4j)。


答案 2
  • commons-logging,log4j,slf4j和JCL之间的区别。我的理解是slf4j是一个包装器,而commons-logging和log4j是实际的实现。我不知道JCL适合在哪里。

Jakarta Commons Logging (JCL) 和 Simple Logging Facade for Java SLF4J 都是各种日志记录框架抽象,例如.java util.logging、log4j 和 logback,允许最终用户在部署时插入所需的日志记录框架。众所周知,Commons Logging存在类加载器问题,这是SLF4J试图解决的问题(SLF4J被认为是一个更干净的库)。

话虽如此,事实是Spring使用Jakarta Commons Logging API(参见Spring中的Loging Dependences):Spring是针对JCL编译的,Spring使JCL对象可用于扩展Spring的类。这实际上是春季唯一的强制性外部依赖。之所以做出这种选择,是因为许多其他框架也使用它(例如Struts)。这个想法是为了避免在构建应用程序时必须在类路径上有多个外观库(“A”表示Spring,“B”表示Struts等)。但是,如果您愿意,可以用SLF4J替换JCL(SFL4J提供了对日志记录框架的绑定,但也提供了“JCL到SLF4J”桥接)。请参阅上面提到的在春季记录依赖关系的文章,了解所有详细信息。Log

  • 如何为Spring配置日志记录。在web.xml文件中,我需要log4j.properties文件还是log4j.xml文件?在WEB-INF中,它去了哪里?我的应用程序文本.xml文件中是否有任何内容?(对不起,但我需要从这里从零开始)。

要进行记录,您需要 1。决定要使用的实现(java.util.logging,log4j或logback),2.如果需要,将所选的一个放在类路径上(java.util.logging 在 Java SE 中,因此不需要额外的库)和 3。来配置它(通过在类路径上放置一个配置文件)。如果你选择使用log4j,只需将它的jar和一个更花哨(但更详细)(这只是配置的另一种格式)添加到类路径中。log4j.propertieslog4j.xml

  • 我在我的项目中使用Hibernate,包括通过Maven。似乎Hibernate使用slf4j-simple。我看到警告说我不能在类路径上同时拥有slf4j-simple和slf4j-log4j。我没有将slf4j-log4j作为依赖项,但Hibernate必须包含它。我该如何解决这个问题?我可以强制休眠改用log4j吗?

Hibernate利用Java的简单日志记录外观(SLF4J),实际上,你不能有多个绑定(例如 和 ) 同时在类路径上。在这里,您很可能从另一个依赖项传递获得。要解决此问题,请运行以找出它的来源,并在需要时将其排除。slf4j-simple.jarslf4j-logj12.jarslf4j-simple.jarmvn dependency:tree

顺便说一句,在你的情况下,我会将Spring配置为使用SLF4J,因为Hibernate正在使用它。请按照第一段中提到的链接中的步骤进行操作。我会使用logback作为日志记录框架(log4j的继承者),这就是现在事情发生的地方。


推荐