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

fslejnso  于 12个月前  发布在  Spring
关注(0)|答案(7)|浏览(168)

我在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>


创建了logs/my.log文件,但没有显示日志。它们是tomcat控制台上的信息日志,但没有配置布局模式。
commons-logging-1.1.1.jar和log4j-1.2.14.jar包含在WEB-INF/lib中。知道这里有什么问题吗?

qmb5sa22

qmb5sa221#

在网络上有很多文档警告人们使用commons-logging,以至于SLF4J越来越流行。
考虑到你对使用Tomcat和Log4j不感兴趣,你应该直接在你的应用程序中使用Log4j。特别是如果你将来没有机会切换日志框架的话。这将降低你的应用程序的复杂性,并摆脱你在使用commons-logging时遇到的任何类加载器问题。
这应该是一个相对容易的搜索和替换在您的文本中,因为commons-logging和log4j都使用类似的调用结构为他们的日志记录方法。

6l7fqoea

6l7fqoea2#

特别要注意的是,你没有将log4j.jar放在Tomcat commons/lib目录中。如果根类加载器加载了log4j库,当你的web应用程序也尝试使用log4j时,你会遇到冲突和初始化问题。
如果您需要使用log4j进行常见的Tomcat日志记录,则需要注意您的Web应用程序也不要尝试加载log4j。如果服务器上有多个Web应用程序,则需要遵守每个Web应用程序的日志初始化不会影响其他Web应用程序的初始化。每个Web应用程序需要使用唯一的Logger ID,这可以通过唯一的包名称来完成。
在Tomcat中使用多个web应用程序的公共log4j会导致严重的冲突,当你有共享的库都想做日志记录时,如Hibernate或Spring。下一个试图初始化log4j的web应用程序可能会关闭前一个的logger。这可能是一个混乱。

6kkfgxo0

6kkfgxo03#

我也遇到过类似的问题,现在找到了解决方法。用附加参数启动tomcat:
-Dorg.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.LogFactoryImpl

bxpogfeg

bxpogfeg4#

您需要编译额外的组件来实现完整的commons-logging。默认情况下,Tomcat 6使用commons-logging的硬编码实现,它总是委托给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目录中。

2q5ifsrm

2q5ifsrm5#

如果您使用log4j +common logging,则可以避免上述大多数配置。common logging LogFactory具有类似于JAXP的发现功能,按照以下优先级搜索Log实现,1.配置属性org.apache.commons.logging.Log inside file commons-logging.properties 2.系统属性org.apache.commons.logging.Log 3.如果Log4J在class path可用,使用相应的 Package 器类(Log4JLogger)。4. Jdk 14 Logger 5. SimpleLog
只要确保common-logging.jar、common-logging-api.jar和log4j.jar都在classpath中。

ibps3vxo

ibps3vxo6#

为了排除公共日志记录的故障,系统属性org.apache.commons.logging.diagnostics.dest允许将输出诊断信息转储到目标文件(我不知道是哪个版本)。

628mspwn

628mspwn7#

可能我错了,请尝试以下操作:
A)将appender添加到我的.package中:ORB)将root的日志级别降低到INFO

相关问题