15

我在部署在 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 中。知道这里有什么问题吗?

4

6 回答 6

10

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

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

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

于 2008-10-20T15:11:24.457 回答
5

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

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

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

于 2008-10-22T18:25:57.153 回答
3

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

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

于 2011-04-01T00:23:42.577 回答
1

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

此处的构建说明http://tomcat.apache.org/tomcat-6.0-doc/building.html

然后替换Tomcat的/bin目录下的tomcat-juli.jar,将tomcat-juli-adapters.jar连同log4j和config一起放到/lib目录下。

于 2008-10-20T13:35:09.380 回答
0

如果您使用 log4j +common 日志记录,则可以避免上述大部分配置。common logging 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

只要确保类路径中的 common-logging.jar 和 common-logging-api.jar 和 log4j.jar 都可以。

于 2010-09-28T14:27:33.440 回答
-1

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

A) 将 appender 添加到 my.package 为: B) 将 root 的日志级别降低到 INFO

于 2010-02-18T12:40:47.770 回答