使用tomcat 6在Spring webapp中设置Commons Logging / Log4j的问题

时间:2008-10-20 09:49:13

标签: java tomcat logging log4j

我遇到了在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 /类/ 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>

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

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

6 个答案:

答案 0 :(得分:10)

网上有许多记录在案的实例警告人们使用公共记录。这么多,SLF4J越来越受欢迎。

考虑到您对使用Tomcat和Log4j不感兴趣,您应该直接在应用程序中使用Log4j。特别是如果您将来不可能切换日志框架。它将降低应用程序的复杂性,并消除使用commons-logging时遇到的任何类加载器问题。

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

答案 1 :(得分:5)

要特别小心,您在Tomcat commons / lib目录中放置了log4j.jar。如果根类加载器加载log4j库,当您的webapps也尝试使用log4j时,您将遇到冲突和初始化问题。

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

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

答案 2 :(得分:3)

我有类似的问题,现在找到了修复。 使用附加参数启动tomcat:

-Dorg.apache.commons.logging.LogFactory = org.apache.commons.logging.impl.LogFactoryImpl

答案 3 :(得分:1)

您需要为完整的commons-logging编译额外的组件。默认情况下,Tomcat 6使用总是委托给java.util.logging的公共日志记录的硬编码实现。

在此处制作说明http://tomcat.apache.org/tomcat-6.0-doc/building.html

然后替换Tomcat的/ bin目录中的tomcat-juli.jar,并将tomcat-juli-adapters.jar与log4j和config一起放在/ lib目录中。

答案 4 :(得分:0)

如果您使用的是log4j +常用日志记录,则可以避免上述大多数配置。常见日志记录LogFactory具有类似于JAXP的发现功能,遵循以下优先级,搜索Log实现,    1.配置属性org.apache.commons.logging.Log里面的文件commons-logging.properties    2.系统属性org.apache.commons.logging.Log    3.如果Log4J在类路径中可用,则使用相应的包装类(Log4JLogger)。    4. Jdk14Logger    5. SimpleLog

只需确保classpath中的common-logging.jar和common-logging-api.jar以及log4j.jar。

答案 5 :(得分:-1)

可能是我错了。请尝试以下方法:

A)将appender添加到my.package中:                     的 B)将root的日志级别减少到INFO