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

在同一JVM中启动两个Spring应用导致日志行重复输出

解决同一JVM中启动多个Spring应用导致Logback日志重复输出的问题

这个问题我之前也碰到过,核心原因是Spring Boot每次启动SpringApplication时都会触发Logback的初始化逻辑,而默认情况下Logback在同一个JVM中会共享上下文,第二次启动时会重复添加STDOUT附加器,最终导致日志被多次输出。

下面给你几个可行的解决方案,按优先级推荐:

方案1:为每个Spring应用配置独立的Logback上下文

这是最稳妥的解决方式,通过为每个应用设置唯一的logback.contextName系统属性,让Logback为每个应用维护独立的日志上下文,彻底避免附加器共享的问题。

修改你的启动代码,在启动每个应用的线程前设置专属的上下文名称:

public static void main(String[] args) throws Exception { 
    run("App1", Main.class, args); 
    run("App2", SecondMain.class, args); 
}

private static void run(String name, Class<?> clazz, String[] args) {
    // 为当前应用设置唯一的Logback上下文名称
    System.setProperty("logback.contextName", name);
    
    SpringApplication app = new SpringApplication(clazz);
    ThreadGroup threadGroup = new ThreadGroup(name);
    Thread t = new Thread(threadGroup, () -> {
        try {
            app.run(args);
        } finally {
            // 线程结束后清理属性,避免影响后续可能的应用启动
            System.clearProperty("logback.contextName");
        }
    }, name + ".Main");
    t.start();
}

不需要修改你的Logback配置,Logback会自动识别不同的上下文名称,为每个应用创建独立的附加器实例。修改后每个应用的日志只会输出一次,不会出现重复或四次输出的情况。

方案2:手动重置Logback上下文(备选)

如果你不想修改系统属性,也可以在启动第二个应用前手动重置Logback的上下文,清除已有的附加器和配置:

private static void run(String name, Class<?> clazz, String[] args) {
    // 重置Logback上下文,清除已有配置和附加器
    LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
    loggerContext.reset();
    
    SpringApplication app = new SpringApplication(clazz);
    ThreadGroup threadGroup = new ThreadGroup(name);
    Thread t = new Thread(threadGroup, () -> {
        app.run(args);
    }, name + ".Main");
    t.start();
}

不过要注意:如果第一个应用还在运行,重置上下文会直接影响它的日志输出,所以这种方式只适合两个应用启动顺序明确且互不干扰的场景。

补充说明

至于你提到的「Spring会手动初始化Logback」,其实是Spring Boot的LoggingApplicationListener在应用启动阶段负责日志系统的自动配置——它会检测当前环境的日志实现(比如Logback),并完成初始化工作。默认情况下,这个逻辑会复用JVM中已有的Logback上下文,这就是多应用启动时附加器重复的根源。

内容的提问来源于stack exchange,提问作者Jimmy T.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:37:35