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

Java 使用tomcat 6的spring webapp中的Commons Logging/Log4j设置存在问题,java,tomcat,logging,log4j,Java,Tomcat,Logging,Log4j,我在Tomcat6下部署的apring webapp中有一个日志设置问题 webapp使用commons日志api,在运行时应使用log4j。日志文件已创建,但仍为空-不会出现任何日志条目 设置如下所示: WEB-INF/WEB.xml: <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/log4j.xml</

我在Tomcat6下部署的apring webapp中有一个日志设置问题

webapp使用commons日志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/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控制台上,但未配置布局模式


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

你需要编译额外的组件来进行完整的公共日志记录。默认情况下,Tomcat6使用一个硬编码的commons日志记录实现,该实现总是委托给java.util.logging

这里有建筑说明


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

web上有许多文档实例警告人们使用commons日志。如此之多,这是获得了很多人气

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


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

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

如果您需要使用log4j来进行普通的Tomcat日志记录,那么您需要注意的是,您的webapp也不会尝试加载log4j。如果服务器上有多个webapp,则需要注意每个webapp的日志初始化不会影响其他webapp的初始化。每个webapp都需要使用唯一的记录器id,这可以通过唯一的包名来实现


在Tomcat中使用多个webapp的公共log4j会导致严重的冲突,因为您共享了所有想要进行日志记录的库,例如Hibernate或Spring。尝试初始化log4j的下一个webapp可能会关闭上一个webapp的记录器。可能会一团糟。

可能是我错了。请尝试以下操作:

A) 将appender添加到my.package中,如下所示: 或 B) 将root的日志级别降低为INFO

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


只需确保类路径中的common-logging.jar、common-logging-api.jar和log4j.jar都存在问题。

我遇到了类似的问题,现在找到了解决方案。 使用附加参数启动tomcat:


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

我不想让tomcat自己用log4j登录,只想用我的webapp。或者有一个tomcat类加载器错误不允许提供我自己的公共日志记录?如果tomcat在它的lib路径中有公共日志记录类,那么它将在加载WEB-INF/lib中的任何JAR之前加载。问题是tomcat 6中的类加载器设计(公共不应该将系统作为父系统)。我认为公共日志记录(从1.1开始,以前有导致内存泄漏的bug)是可以的。但是直接使用log4j可能是最好的解决方案——让使用commons日志的库不被跟踪。这一切在Tomcat 5.5中都起到了作用——有时情况变得更糟,commons日志仍然是垃圾(2010),使用slf4j。这没那么容易,我知道配置log4j。对我来说很有用!!谢谢!已经坚持了一周了:P
<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>