使用 Tomcat 6 在 Spring Web 应用程序中设置 Commons Logging / Log4j 时出现问题

问题描述 投票:0回答:7

我在 tomcat 6 下部署的 apring web 应用程序中的日志记录设置有问题。

Web应用程序使用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 中。知道这里出了什么问题吗?

java tomcat logging log4j
7个回答
10
投票

网络上有大量记录在案的实例警告人们不要使用公共日志记录。正因如此,SLF4J 越来越受欢迎。

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

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


5
投票

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

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

当您拥有所有都想要进行日志记录的共享库(例如 Hibernate 或 Spring)时,在 Tomcat 中与多个 Web 应用程序一起使用通用 log4j 会导致严重冲突。下一个尝试初始化 log4j 的 Web 应用程序可能会关闭前一个 Web 应用程序的记录器。这可能会很混乱。


3
投票
我遇到了类似的问题,现在找到了解决办法。 使用附加参数启动 tomcat:

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


1
投票
您需要编译额外的组件以实现完整的公共日志记录。默认情况下,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目录下。


0
投票
如果您使用 log4j +common 日志记录,则可以避免上述大部分配置。常见的日志记录 LogFactory 具有类似于 JAXP 的发现功能,按照以下优先顺序,搜索 Log 实现, 1.配置属性org.apache.commons.logging.Log在文件commons-logging.properties中 2.系统属性org.apache.commons.logging.Log 3. 如果 Log4J 在类路径中可用,则使用相应的包装类 (Log4JLogger)。 4.Jdk14Logger 5. 简单日志

只需确保 common-logging.jar 和 common-logging-api.jar 以及 log4j.jar 都位于类路径中。


0
投票
要对记录系统属性的公共问题进行故障排除

org.apache.commons.logging.diagnostics.dest

允许将输出诊断信息转储到目标文件(我不知道来自哪个版本)。


-1
投票
也许我错了。请尝试以下操作:

A)将附加程序添加到 my.package 中,如下所示:

B) 将root的日志级别降低为INFO

© www.soinside.com 2019 - 2024. All rights reserved.