簡體   English   中英

Spring Boot:LoggingApplicationListener干擾Application Server日志記錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM