我正在使用春季啓動1.5.4,我正在嘗試編寫一個啓動程序,包括任何使用它的應用程序的自定義日誌appender。這是我如何註冊它:在春季啓動啓動器註冊自定義日誌appender
@Override
synchronized public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
if (!addedCustomAppender && metricProperties.isEnabled()) {
//Add log appender for Monitoring
EventsPublisher eventsPublisher = contextRefreshedEvent.getApplicationContext().getBean(EventsPublisher.class);
final Appender<ILoggingEvent> newAppender = new CustomLogbackAppender(eventsPublisher);
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
final Logger root = context.getLogger("ROOT");
newAppender.setName("Custom Appender");
newAppender.setContext(context);
newAppender.start();
root.addAppender(newAppender);
addedCustomAppender = true;
}
}
這被調用,我可以看到ROOT記錄器有appender。實際上它在應用程序啓動期間工作了幾秒鐘。
但是很快,在應用程序啓動後期,ApplicationEnvironmentPreparedEvent被觸發,這觸發了LoggingApplicationListener中的一種重新初始化。
出現這種情況之後我在日誌中看到:
INFO 15888 --- [ main] o.s.c.support.DefaultLifecycleProcessor : Starting beans in phase -2147482648
在LogbackLoggingSystem,我可以看到stopAndReset方法,它調用記錄器recursiveReset方法的調用。之後,Spring默認配置被加載,並且我的自定義appender不再存在。
我該如何避免這種情況發生,以便我的自定義appender儘可能早地獲取一些日誌並保持連接到ROOT記錄器?
或者至少我怎麼能在所有事情都被初始化後註冊我的appender? (在這種情況下,我想我會錯過一些日誌,所以這不是我的目標解決方案)
謝謝!
謝謝,它的工作原理!我有一個骯髒的修復程序,包括在每當我發現它不再存在時重新附加它,但這更好! –
附加說明:啓用自動配置後,無需在監聽器(..)的app main方法中手動添加監聽器:偵聽器將自動註冊 –