為了讓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>