Commons Logging / Log4j在春季Webapp中设置tomcat 6的问题

2022-09-03 14:23:48

我在tomcat 6下部署的apring webapp中的日志记录设置方面遇到了问题。

webapp使用commons-logging api,在运行时log4j上应该使用。日志文件已创建,但保持为空 - 不发生任何日志条目。

设置如下:

WEB-INF/web.xml:

 <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/log4j.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  </listener>

WEB-INF/classes/commons-logging.properties:

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger

WEB-INF/log4j.xml:

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>

  <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
    ...
  </appender>
  <appender name="FILE" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="${catalina.home}/logs/my.log"/>
    ...
  </appender>

  <logger name="my.package">
    <level value="INFO"/>
  </logger>

  <root>
    <level value="ERROR"/>
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
  </root>
</log4j:configuration>

将创建文件日志/my.log,但不显示任何日志。这些是 tomcat 控制台上的信息日志,但不是配置了布局模式。

commons-logging-1.1.1.jar 和 log4j-1.2.14.jar包含在 WEB-INF/lib 中。你知道这里出了什么问题吗?


答案 1

网络上有许多记录在案的实例,警告人们使用共享资源日志记录。如此之多,以至于SLF4J越来越受欢迎。

考虑到您对将Tomcat与Log4j一起使用不感兴趣,您应该直接在应用程序中使用Log4j。特别是如果您将来没有机会切换日志记录框架。它将降低应用程序的复杂性,并消除您在共享资源日志记录中遇到的任何类装入器问题。

这应该是一个相对容易的搜索和替换你的文本,因为commons-logging和log4j都使用类似的调用结构来记录它们的方法。


答案 2

要特别小心,你没有把log4j.jar放在Tomcat commons/lib目录中。如果根类装入器加载 log4j 库,则当您的 web 应用也尝试使用 log4j 时,您将遇到冲突和初始化问题。

如果您需要使用log4j进行常见的Tomcat日志记录,则需要注意您的Web应用程序不会尝试加载log4j。如果服务器上有多个 Web 应用,则需要遵守每个 Web 应用的日志初始化不会踩到其他 Web 应用的初始化。每个 Web 应用都需要使用唯一的记录器 ID,这可以通过唯一的包名称来完成。

在Tomcat中使用具有多个Web应用程序的通用log4j会导致严重的冲突,当您拥有所有想要进行日志记录的共享库时,例如Hibernate或Spring。下一个尝试初始化log4j的web应用程序可能会关闭前一个webapp的记录器。它可能是一团糟。


推荐