在同一 JVM 中启动两个 spring 应用程序会导致双倍的日志行
Starting two spring applications in same JVM results in doubled log lines
我尝试在同一个 JVM 中启动两个 Spring 应用程序,它们运行良好,除了现在每个日志行都被写入两次,所以如果为两个应用程序写入的日志行被写入四个倍有效。
我还尝试查看记录器附加了哪些附加程序,我在其中 STDOUT
两次,这可以解释这种行为。
似乎开始 spring 两次最终初始化 logback 两次而没有重置第一次初始化。
有什么方法可以抑制这种行为吗?没想到spring会手动初始化
我用来启动两个应用程序的代码(Main
和 SecondaryMain
在两个独立的包中,都不包含在另一个中):
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将只初始化一次日志记录
这似乎是更简洁的解决方案,我还没有看到它的缺点
我尝试在同一个 JVM 中启动两个 Spring 应用程序,它们运行良好,除了现在每个日志行都被写入两次,所以如果为两个应用程序写入的日志行被写入四个倍有效。
我还尝试查看记录器附加了哪些附加程序,我在其中 STDOUT
两次,这可以解释这种行为。
似乎开始 spring 两次最终初始化 logback 两次而没有重置第一次初始化。
有什么方法可以抑制这种行为吗?没想到spring会手动初始化
我用来启动两个应用程序的代码(Main
和 SecondaryMain
在两个独立的包中,都不包含在另一个中):
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将只初始化一次日志记录
这似乎是更简洁的解决方案,我还没有看到它的缺点