本文介绍如何配置tomcat使用log4j来替代java.util.logging来产生tomcat本身的日志信息。
说明:只有当我们需要重新配置tomcat来使用Apache log4j来记录tomcat本身的日志时才需要这部分所讲内容。当仅仅想在我们的web应用程序中使用log4j时这些操作不是必要的。如果是仅仅想在web应用中使用log4j,只要把log4j.jar和log4j.properties放到web应用的WEB-INF/lib和WEB-INF/classes目录下即可。
下面的步骤介绍了在tomcat中配置log4j来输出tomcat内部日志。
1、创建一个包含下面内容的名为log4j.properties的文件,并且把它存储在$CATALINA_BASE/lib目录下。
log4j.rootLogger=INFO, CATALINA
# Define all the appenders
log4j.appender.CATALINA=org.apache.log4j.DailyRollingFileAppender
log4j.appender.CATALINA.File=${catalina.base}/logs/catalina.
log4j.appender.CATALINA.Append=true
log4j.appender.CATALINA.Encoding=UTF-8
# Roll-over the log once per day
log4j.appender.CATALINA.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.CATALINA.layout = org.apache.log4j.PatternLayout
log4j.appender.CATALINA.layout.ConversionPattern = %d [%t] %-5p %c- %m%n
log4j.appender.LOCALHOST=org.apache.log4j.DailyRollingFileAppender
log4j.appender.LOCALHOST.File=${catalina.base}/logs/localhost.
log4j.appender.LOCALHOST.Append=true
log4j.appender.LOCALHOST.Encoding=UTF-8
log4j.appender.LOCALHOST.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.LOCALHOST.layout = org.apache.log4j.PatternLayout
log4j.appender.LOCALHOST.layout.ConversionPattern = %d [%t] %-5p %c- %m%n
log4j.appender.MANAGER=org.apache.log4j.DailyRollingFileAppender
log4j.appender.MANAGER.File=${catalina.base}/logs/manager.
log4j.appender.MANAGER.Append=true
log4j.appender.MANAGER.Encoding=UTF-8
log4j.appender.MANAGER.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.MANAGER.layout = org.apache.log4j.PatternLayout
log4j.appender.MANAGER.layout.ConversionPattern = %d [%t] %-5p %c- %m%n
log4j.appender.HOST-MANAGER=org.apache.log4j.DailyRollingFileAppender
log4j.appender.HOST-MANAGER.File=${catalina.base}/logs/host-manager.
log4j.appender.HOST-MANAGER.Append=true
log4j.appender.HOST-MANAGER.Encoding=UTF-8
log4j.appender.HOST-MANAGER.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.HOST-MANAGER.layout = org.apache.log4j.PatternLayout
log4j.appender.HOST-MANAGER.layout.ConversionPattern = %d [%t] %-5p %c- %m%n
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Encoding=UTF-8
log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = %d [%t] %-5p %c- %m%n
# Configure which loggers log to which appenders
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=INFO, LOCALHOST
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager]=\
INFO, MANAGER
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager]=\
INFO, HOST-MANAGER
2、下载Log4j(1.2或者是更高版本)。
3、下载或者是编译tomcat-juli.jar和tomcat-juli-adapters.jar,这两个组件对于tomcat来说是附件组件。详情查看附件组件文档。
这个tomcat-juli.jar与tomcat默认的同名文件不同。它包括Apache Commons Logging的实现,所以我们可以用它来呈现log4j日志信息并且配置log4j。
4、如果我们想在tomcat全局内配置并且使用log4j:
l 把log4j.jar放到$CATALINA_HOME/lib下面;
l 使用从tomcat官方网站上下载的附加组件tomcat-juli.jar替换$CATALINA_HOME/bin/tomcat-juli.jar;
l 把附件组件tomcat-juli-adapters.jar放到$CATALINA_HOME/lib目录下;
5、如果我们的tomcat拥有不同的$CATALINA_HOME和$CATALINA_BASE目录,并且我们只想在$CATALINA_BASE目录下配置使用log4j。
l 如果$CATALINA_BASE/bin和$CATALINA_BASE/lib目录不存在,那么首先创建它们;
l 把log4j.jar放到$CATALINA_BASE/lib目录下;
l 使用附加的tomcat-juli.jar替换$CATALINA_BASE/bin/tomcat-juli.jar;
l 把附加的tomcat-juli-adapters.jar放到$CATALINA_BASE/lib目录下;
l 如果我们是在安全模式下运行,我们需要编辑$CATALINA_BASE/conf/catalina.policy文件使tomcat可以使用不同的tomcat-juli.jar;
l 旧版本的tomcat.juli.jar仍然被bootstrap的manifest引用,因此它会在tomcat的类路径下隐式的表现出来。tomcat启动脚本把$CATALINA_BASE/bin/tomcat-juli.jar配置在bootstrap.jar前面,所以它应该有更高的优先级。因此考虑到移除不需要的tomcat-juli.jar副本(把它copy到不使用log4j的其它任何$CATALINA_BASE目录下),这应该没什么问题。Tomcat 7不存在这个问题。
6、删除$CATALINA_BASE/conf/logging.properties文件来防止java.util.logging产生零长度的日志文件。
7、启动tomcat。
这个log4j配置借鉴了tomcat默认的java.util.logging的配置:manager和host-manager 应用各自都可以获得一份日志文件,任何其它的信息都输出到catalina.log文件。每个日志文件每天会滚动生成新的带有日期时间戳的日志文件。
我们必须更加谨慎的了解那个包包含日志。Tomcat通过引擎和主机名来定义loggers。比如,为了详细的了解本地Catalina日志,把这些加到上面log4j.properties文件的结尾。注意由于在基于XML的log4j配置文件中,存在使用名字转换的已知问题,因此我们建议大家使用上面讲过的资源文件(properties)直到将来log4j版本允许这种转换。
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=DEBUG
log4j.logger.org.apache.catalina.core=DEBUG
log4j.logger.org.apache.catalina.session=DEBUG
警告:DEBUG级别的日志会产生上M的日志,并且会拖慢tomcat的启动过程。这个级别的警告只有在必须调试tomcat内部操作的时候才可以使用。
我们的web应用程序应该会使用它们自己的log4j配置。但是上面的配置依然有效。我们可以把一个类似的log4j.properties文件放到我们web应用的WEB-INF/classes目录下,而且把log4jx.y.z.jar放到WEB-INF/lib目录下。然后指定我们的包级别的日志输出。这是一个基本的不需要Common-Logging的log4j配置,我们应该访问log4jdocumentation来获取更多的配置选项。这篇文章仅仅是为了自举过程的指导。
附加说明:
这会通过Common类库加载器把log4j库暴露给web应用。详细信息查看classloading文档。
出于这个原因,使用Apache Commons Logging类库的web应用和类库会自动的把log4j作为主要的日志实现。
对于那些直接使用java.util.logging的web应用,java.util.logging仍然有效。${catalina.base}/conf/logging.properties文件仍然会被tomcat启动脚本引用。
上面的一步提到删除${catalina.base}/conf/logging.properties文件,仅仅会导致java.util.logging会滚到JRE所配置的默认配置,它使用ConsoleHandler并且不产生任何文件。