为了让web application能随意使用logging组件而不受web容器自身的影响,从tomcat 6.0开始,tomact默认使用的是java.util.logging framework来记录其运行日志,但同时也提供了可选择其他log框架的接口扩展包,官网上给出了如何将tomcat的运行日志框架切换到log4j,但是目前大部分web应用都使用的是性能更好的log4j2,其配置过程相比于log4j,稍有不同,今天就给大家介绍一些如何将tomcat的运行日志框架切换到log4j2下。
基础组件准备:
开始前需要准备tomcat,由于我们线上使用的是tomcat 7.0.59,因此本文基于此版本进行升级,log4j2使用现在最新的2.5,主要是因为我们需要将tomcat的运行日志打进kafka进行分析,而log4j2只用2.4及以后的版本才支持kafka的append。
详细步骤:
- 下载tomcat运行日志框架扩展的接口包tomcat-juli.jar和 tomcat-juli-adapters.jar,其中tomcat-juli.jar包含了Apache Commons Logging 实现类,用于发现log4j2包的位置,adapter应该是个适配接口。下载地址为:http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.59/bin/extras/tomcat-juli.jar ,http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.59/bin/extras/tomcat-juli-adapters.jar
- 下载log4j2日志2.5版本,包括3个jar,log4j-core-2.5,log4j-api-2.5,log4j-1.2-api-2.5,其中log4j-1.2-api-2.5用于log4j2与log4j1的桥接,下载地址为:http://mirror.bit.edu.cn/apache/logging/log4j/2.5/apache-log4j-2.5-bin.zip
- 将下载下来的3个log4j2的jar包和 tomcat-juli-adapters.jar放到tomact目录下的lib文件夹下;
- 将下载下来的tomcat-juli.jar替换tomcat目录下bin文件夹下的同名文件;
- 删除或重命名tomact目录下conf文件夹下的logging.properties文件;
- 新增log4j2.xml,放到tomcat目录下lib文件夹下(参看附件);
- 启动tomcat,在tomcat目录下logs文件夹下查看日志文件
如果你的web工程不是放在tomcat/webapp下,需要在web工程所在目录下做类似操作,具体看参考文档,这里我就截个图简单提示一下:
至此tomcat运行日志框架升级完成,由于log4j2支持mq,kafka,db等多种append,因此我们可以更好的处理tomcat的运行日志。
参考:
附:log4j2.xml配置内容
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="off"> <Properties> <Property name="CATALINA_BASE_LOGPATH">../logs</Property> <Property name="logLocalIP">10.11.12.13</Property> </Properties> <appenders> <console name="CONSOLE" target="SYSTEM_OUT"> <patternLayout charset="UTF-8" pattern="%date{yyyy-MM-dd HH:mm:ss}[%-5level]%logger[%L]-%message%n" /> </console> <rollingFile name="CATALINA" fileName="${CATALINA_BASE_LOGPATH}/catalina.log" filePattern="${CATALINA_BASE_LOGPATH}/catalina.%date{yyyyMMdd}"> <patternLayout charset="UTF-8" pattern="%date{yyyy-MM-dd HH:mm:ss}[%-5level]%logger[%L]-%message%n" /> <policies> <timeBasedTriggeringPolicy /> <SizeBasedTriggeringPolicy size="100 MB"/> </policies> </rollingFile> <rollingFile name="LOCALHOST" fileName="${CATALINA_BASE_LOGPATH}/localhost.log" filePattern="${CATALINA_BASE_LOGPATH}/localhost.%date{yyyyMMdd}"> <patternLayout charset="UTF-8" pattern="%date{yyyy-MM-dd HH:mm:ss}[%-5level]%logger[%L]-%message%n" /> <policies> <timeBasedTriggeringPolicy /> </policies> </rollingFile> <rollingFile name="MANAGER" fileName="${CATALINA_BASE_LOGPATH}/manager.log" filePattern="${CATALINA_BASE_LOGPATH}/manager.%date{yyyyMMdd}"> <patternLayout charset="UTF-8" pattern="%date{yyyy-MM-dd HH:mm:ss}[%-5level]%logger[%L]-%message%n" /> <policies> <timeBasedTriggeringPolicy /> </policies> </rollingFile> <rollingFile name="HOST-MANAGER" fileName="${CATALINA_BASE_LOGPATH}/host-manager.log" filePattern="${CATALINA_BASE_LOGPATH}/host-manager.%date{yyyyMMdd}"> <patternLayout charset="UTF-8" pattern="%date{yyyy-MM-dd HH:mm:ss}[%-5level]%logger[%L]-%message%n" /> <policies> <timeBasedTriggeringPolicy /> </policies> </rollingFile> <Kafka name="KAFKA_ERROR" topic="leinfo"> <filters> <thresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" /> </filters> <patternLayout charset="UTF-8" pattern="%date{yyyy-MM-dd HH:mm:ss}||%-5level||%logger||Tomcat||${logLocalIP}||%mdc{logRemoteIP}||%ex{short.className}.%ex{short.methodName}[%ex{short.lineNumber}]||%message||%ex{1}%n" > </patternLayout> <Property name="bootstrap.servers">10.11.12.13:9092,20.150.70.106:9092(示例)</Property> </Kafka> </appenders> <loggers> <logger name="org.apache.catalina.core.ContainerBase.[Catalina].[localhost]" level="INFO"> <appender-ref ref="LOCALHOST" /> </logger> <logger name="org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager]" level="INFO" additivity="false"> <appender-ref ref="MANAGER" /> </logger> <logger name="org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager]" level="INFO" additivity="false"> <appender-ref ref="HOST-MANAGER" /> </logger> <Logger name="org.apache.kafka" level="INFO" /><!-- avoid recursive logging --> <root level="INFO"> <appender-ref ref="CATALINA" /> <appender-ref ref="KAFKA_ERROR" /> <appender-ref ref="CONSOLE" /> </root> </loggers> </configuration>