Tomcat 8下如何将日志重定向至Logback配置的自定义文件?
在Windows环境中使用Tomcat 8和Logback,已配置logback.xml如下:
<configuration> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>logging.log</file> <param name="Append" value="false" /> <encoder> <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern> </encoder> </appender> <root level="info"> <appender-ref ref="FILE" /> </root> </configuration>
相关pom.xml依赖配置:
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.11</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> <scope>compile</scope> </dependency>
通过public static void main方法启动应用时,日志可正常输出至项目下的logging.log文件;但部署到Apache Tomcat 8启动后,日志走Tomcat内置日志系统,自定义的logging.log文件始终为空。需要将所有日志重定向至该自定义文件。
1. 排除Tomcat自带的日志冲突依赖
Tomcat默认自带了SLF4J桥接包或其他日志实现,会和你的Logback抢日志控制权。得在项目的pom.xml里排除Tomcat相关的日志依赖,同时保证你的Logback包能打包到WAR包里:
<!-- 如果用Tomcat Maven插件,加这段排除配置 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.36</version> <scope>provided</scope> </dependency> </dependencies> </plugin> <!-- 或者直接在Tomcat依赖里排除冲突包 --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-catalina</artifactId> <version>8.5.85</version> <scope>provided</scope> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> </exclusion> </exclusions> </dependency>
2. 确认logback.xml的位置
Web项目里,logback.xml必须放在src/main/resources目录下,打包后会进入WAR的WEB-INF/classes文件夹,Logback才能找到并加载这个配置。位置错了的话,Logback会用默认配置,日志自然就走Tomcat的系统了。
3. 指定日志文件的绝对路径
你现在配置的<file>logging.log</file>是相对路径,Tomcat部署后,相对路径的基准是Tomcat的bin目录,不是你的项目目录,所以文件可能生成在Tomcat的bin文件夹里,不是你预期的位置。改成绝对路径就行:
<file>D:/你的项目路径/logging.log</file>
或者用Tomcat的系统变量来指定,这样更灵活:
<file>${catalina.base}/logs/你的应用日志.log</file>
4. 添加Logback的Web监听器
在WEB-INF/web.xml里加个Logback的监听器,确保Web应用启动时优先初始化Logback,抢在Tomcat日志系统之前生效:
<listener> <listener-class>ch.qos.logback.classic.servlet.LogbackConfigListener</listener-class> </listener> <!-- 可选:如果你的配置文件不在默认位置,就加这个参数指定路径 --> <context-param> <param-name>logbackConfigLocation</param-name> <param-value>/WEB-INF/classes/logback.xml</param-value> </context-param>
5. 把Tomcat自身日志也导入自定义文件(可选)
如果连Tomcat自己的日志也想弄到你的自定义文件里,得修改Tomcat的conf/logging.properties,把默认日志处理器换成SLF4J的桥接器,不过要先把logback-core、logback-classic、slf4j-api还有jul-to-slf4j这几个包放到Tomcat的lib目录下:
# 替换原来的handler handlers = org.slf4j.bridge.SLF4JBridgeHandler # 关掉默认的控制台日志 java.util.logging.ConsoleHandler.level = OFF java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
然后在logback.xml里加对Tomcat日志的处理配置:
<logger name="org.apache.catalina" level="info" additivity="false"> <appender-ref ref="FILE"/> </logger> <logger name="org.apache.tomcat" level="info" additivity="false"> <appender-ref ref="FILE"/> </logger>
内容的提问来源于stack exchange,提问作者cognosce

