gpt4 book ai didi

java - Spring 启动 : LoggingApplicationListener interfering with Application Server logging

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:22:27 25 4
gpt4 key购买 nike

Spring Boot 使用 LoggingApplicationListener 自动初始化底层日志系统。如果我正在开发的应用程序独立或独立运行,这是一件好事。

然而,我正在开发一个将部署到 WSO2 应用服务器的 Web 应用程序,它提供统一的日志记录(使用 log4j),具有中央日志级别管理(在运行时通过 Web 界面)、业务报告等功能。

如果我“按原样”使用 Spring Boot,它会完全自行记录所有内容。我的第一个镜头是删除 spring-boot-starter-logging 并手动添加 slf4j-api 作为 provided。这在某种程度上是有效的,因为 LoggingApplicationListener 现在覆盖了 WSO2 提供的全局日志管理器的设置(甚至导致全局 appender 被关闭)。

我想出的唯一“解决方案”是通过反射移除监听器。然后 Spring Boot 开始正常运行(通过全局记录器进行记录,而不是覆盖预定义的日志级别、输出格式、附加程序等)

“解决方案”看起来像这样:

@SpringBootApplication
public class MyApp extends SpringBootServletInitializer {

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

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
try {
Field appField = SpringApplicationBuilder.class.getDeclaredField("application");
appField.setAccessible(true);
SpringApplication app = (SpringApplication)appField.get(builder);

Field listenersField = SpringApplication.class.getDeclaredField("listeners");
listenersField.setAccessible(true);
List<ApplicationListener<?>> listeners = (List<ApplicationListener<?>>) listenersField.get(app);
for (int i = listeners.size() - 1; i >= 0; --i) {
if (listeners.get(i) instanceof LoggingApplicationListener) {
listeners.remove(i);
}
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return builder.sources(MyApp.class);
}
}

对于我的问题,有没有更好的解决方案,而且我在研究和代码分析过程中可能忽略了这些问题?

最佳答案

谢谢你的帖子,很有帮助。我在使用 Websphere Aplication Server 时遇到了同样的问题:初始化 spring boot 上下文后,我没有更多日志。这个解决方案是等效的,但通过覆盖 SpringBootServletInitializer 的运行方法不那么脏:

@Override
protected WebApplicationContext run(SpringApplication application) {
Collection<ApplicationListener<?>> listeners =
new ArrayList<>();
for (ApplicationListener<?> listener: application.getListeners()) {
if (!(listener instanceof LoggingApplicationListener)) {
listeners.add(listener);
}
}
application.setListeners(listeners);
return super.run(application);
}

关于java - Spring 启动 : LoggingApplicationListener interfering with Application Server logging,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29609996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com