You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 10:21:37