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

SpringBoot3 WAR部署Tomcat10.1.19:日志文件生成但无内容写入

SpringBoot 3 WAR 部署 Tomcat 后 Log4j2 无日志写入/格式异常排查方案

核心原因分析

第三方库引入了冲突的日志实现(比如偷偷打包了Logback或旧版Log4j),导致Tomcat启动时LoggerContext被多次初始化,你自定义的log4j2.xml配置被后续重配置覆盖,Appender绑定失效,同时控制台日志 fallback 到容器默认的日志实现。

分步解决方案

1. 彻底排查第三方库的日志依赖

在项目根目录执行Maven命令,拉取完整依赖树,定位第三方库带进来的冲突日志组件:

mvn dependency:tree -Dincludes=ch.qos.logback*,org.apache.logging.log4j*,org.slf4j*

找到冲突的日志包(比如logback-core、logback-classic),直接在pom.xml的第三方库依赖中排除:

<dependency>
    <groupId>第三方库groupId</groupId>
    <artifactId>第三方库artifactId</artifactId>
    <exclusions>
        <exclusion>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </exclusion>
        <!-- 如有旧版Log4j也一并排除 -->
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2. 加固SpringBoot日志配置优先级

在application.properties(或yml)中强制指定日志配置文件路径,防止被动态重写:

logging.config=classpath:log4j2.xml
logging.log4j2.configuratorClass=org.apache.logging.log4j.core.config.Configurator

确保log4j2.xml放在src/main/resources目录下,打包后能被正确加载。

3. 配置Tomcat类加载隔离(关键)

Tomcat10的类加载机制会优先加载容器自身的日志组件,导致应用的Log4j2被覆盖。修改Tomcat的conf/catalina.properties,添加:

# 让Web应用优先加载自身的日志库
tomcat.util.scan.StandardJarScanFilter.jarsToSkip=log4j-core*.jar,log4j-api*.jar,log4j-jakarta-web*.jar,slf4j-api*.jar
# 禁止容器日志组件干扰应用
org.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES=false

同时在项目WEB-INF目录下创建tomcat-web.xml(无则新建),添加类加载优先级配置:

<?xml version="1.0" encoding="UTF-8"?>
<tomcat-web-app xmlns="http://tomcat.apache.org/xml"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-web-app_4_0.xsd"
                version="4.0">
    <classloading>
        <!-- 应用类加载器优先于容器类加载器 -->
        <loader delegate="false"/>
    </classloading>
</tomcat-web-app>

4. 验证Log4j2上下文初始化

在应用启动类中添加一段代码,打印当前LoggerContext的配置,确认自定义log4j2.xml是否被加载:

@SpringBootApplication
public class YourApplication extends SpringBootServletInitializer {
    static {
        LoggerContext context = (LoggerContext) LogManager.getContext(false);
        Configuration config = context.getConfiguration();
        System.out.println("Current Log4j2 Configuration: " + config.getName());
        System.out.println("Appenders loaded: " + config.getAppenders().keySet());
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(YourApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}

启动Tomcat后,查看控制台输出:如果能看到你定义的Appender名称,说明配置加载成功;如果看不到,回到第一步重新排查依赖冲突。

5. 修复Appender异常

如果日志显示Appender初始化异常,检查log4j2.xml配置:

  • 日志文件路径用绝对路径,比如${catalina.base}/logs/your-app.log,避免相对路径引发的权限问题
  • 确保Tomcat运行用户对日志目录有读写权限
  • 检查滚动策略配置(比如SizeBasedTriggeringPolicy的size值)是否合理

验证步骤

  1. 重新打包WAR,部署到Tomcat
  2. 启动Tomcat,查看控制台是否输出自定义格式的日志
  3. 检查日志文件是否有内容写入
  4. 查看Tomcat的logs/catalina.out,确认无LoggerContext重初始化的异常信息

内容的提问来源于stack exchange,提问作者nelDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:10:20