[英]Spring Boot: LoggingApplicationListener interfering with Application Server logging
Spring Boot使用LoggingApplicationListener
自動初始化基礎日志記錄系統。 如果我正在開發的應用程序是孤立的或獨立的,那么這是一件好事。
但是我正在開發一個Web應用程序,它將部署到WSO2 Application Server中,它提供統一的日志記錄(使用log4j),具有中央日志級別管理(運行時通過Web界面),業務報告等功能。
如果我“按原樣”使用Spring Boot,它會完全記錄所有內容。 我的第一個鏡頭是,除去spring-boot-starter-logging
和手動添加slf4j-api
作為provided
。 這在某種程度上起作用,因為LoggingApplicationListener
現在覆蓋了WSO2提供的全局logmanager的設置(甚至導致全局appender被關閉)。
我想出的唯一“解決方案”是通過反射刪除監聽器。 然后Spring Boot開始表現得完全正常(通過全局記錄器記錄,而不是覆蓋預定義的日志級別,輸出格式,appender等)
那個“解決方案”看起來像這樣:
@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相同的問題:在初始化春季啟動上下文后,我沒有更多日志。 通過覆蓋SpringBootServletInitializer的run方法,此解決方案相當但不那么臟:
@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);
}
從Spring Boot 1.4開始,可以禁用LoggingSystem自動配置。
看一下Spring文檔的Custom Log Configuration部分:
您可以使用
org.springframework.boot.logging.LoggingSystem
系統屬性強制Spring Boot使用特定的日志記錄系統。 該值應該是LoggingSystem
實現的完全限定類名。 您還可以使用none
值完全禁用Spring Boot的日志記錄配置。
例如,對於Tomcat,設置環境變量JAVA_OPTS
:
JAVA_OPTS="-Dorg.springframework.boot.logging.LoggingSystem=none"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.