Log4J2源碼系列(十一) - 從2.6版本影響到現在的bug, 使用JMX監控的可以看看

這個bug是我在看源碼的過程中發現的,已經發了jira給Log4J2的團隊.

bug信息

  • 背景:logger配置變化的時候,會通過LoggerContext的updateLogger方法更新,併發送一條propertyChangeEvent的事件
  • 問題:請先看以下代碼:
	public void updateLoggers() {
        updateLoggers(this.configuration);
    }

    public void updateLoggers(final Configuration config) {
        final Configuration old = this.configuration;
        for (final Logger logger : loggerRegistry.getLoggers()) {
            logger.updateConfiguration(config);
        }
        firePropertyChangeEvent(new PropertyChangeEvent(this, PROPERTY_CONFIG, old, config));
    }

大家可以看到,如果調用updateLoggers方法來更新配置,這樣會導致PropertyChangeEvent中的old和new始終都會是一樣的,對應的監聽器如果有使用到就會出現問題。

影響範圍

  • LoggerContext中的setConfiguration 方法重複發送該事件,這可能是因爲開始updateLoggers方法中沒有firePropertyChangeEvent,加上之後代碼沒仔細review導致的,請看問題代碼:
    this.configuration = config;
        updateLoggers();
        if (prev != null) {
            prev.removeListener(this);
            prev.stop();
        }

        firePropertyChangeEvent(new PropertyChangeEvent(this, PROPERTY_CONFIG, prev, config));
  • 監聽了PropertyChangeEvent的監聽會有錯誤處理的情況,就目前log4j-core的代碼來看,只有在LoggerContextAdmin有監聽這個事件,它的處理邏輯如下:
  public void propertyChange(final PropertyChangeEvent evt) {
        if (!LoggerContext.PROPERTY_CONFIG.equals(evt.getPropertyName())) {
            return;
        }
        final Notification notif = new Notification(NOTIF_TYPE_RECONFIGURED, getObjectName(), nextSeqNo(), now(), null);
        sendNotification(notif);
    }

幸好event中的old和new沒有被使用到。

結語

這麼長時間都沒有發現, 說明這個功能很有可能就是沒啥人用的一個雞肋的功能而已···

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章