我在 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 中。知道这里出了什么问题吗?
网络上有大量记录在案的实例警告人们不要使用公共日志记录。正因如此,SLF4J 越来越受欢迎。
考虑到您对将 Tomcat 与 Log4j 一起使用不感兴趣,您应该直接在应用程序中使用 Log4j。特别是如果您将来没有机会切换日志框架的话。它将降低应用程序的复杂性,并消除您在公共日志记录方面遇到的任何类加载器问题。
这应该是文本中相对容易的搜索和替换,因为 commons-logging 和 log4j 的日志记录方法都使用类似的调用结构。
要特别小心,不要将 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 应用程序的记录器。这可能会很混乱。
-Dorg.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.LogFactoryImpl
只需确保 common-logging.jar 和 common-logging-api.jar 以及 log4j.jar 都位于类路径中。
org.apache.commons.logging.diagnostics.dest
允许将输出诊断信息转储到目标文件(我不知道来自哪个版本)。
A)将附加程序添加到 my.package 中,如下所示:
或 B) 将root的日志级别降低为INFO