在同一 JVM 中启动两个 spring 应用程序会导致双倍的日志行

Starting two spring applications in same JVM results in doubled log lines

我尝试在同一个 JVM 中启动两个 Spring 应用程序,它们运行良好,除了现在每个日志行都被写入两次,所以如果为两个应用程序写入的日志行被写入四个倍有效。

我还尝试查看记录器附加了哪些附加程序,我在其中 STDOUT 两次,这可以解释这种行为。

似乎开始 spring 两次最终初始化 logback 两次而没有重置第一次初始化。

有什么方法可以抑制这种行为吗?没想到spring会手动初始化

我用来启动两个应用程序的代码(MainSecondaryMain 在两个独立的包中,都不包含在另一个中):

    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)
    {
        SpringApplication run = new SpringApplication(clazz);

        ThreadGroup threadGroup = new ThreadGroup(name);
        Thread t = new Thread(threadGroup, () -> {run.run(args);}, name+".Main");
        t.start();
    }

我的 logback 配置(没什么特别的):

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd' 'HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="info">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

与此同时,我找到了两种方法来完成它

在 spring

中禁用日志记录管理

可以指定 spring 应该使用的日志系统,但也有选项 none 所以它不会自己设置任何东西,这样也不会两次

缺点是它不会集成日志记录,在我的例子中,一些用于登录到 logback 的组件突然没有。

使用父上下文

如果两个应用程序共享一个父合同spring将只初始化一次日志记录

这似乎是更简洁的解决方案,我还没有看到它的缺点