天天看點

如何動态改變日志級别

關于日志級别,大部分項目可能都設定為info級别,當然也可能有一些追求性能或者說包含很多敏感資訊的項目直接将級别設定為warn或者error;這時候如果項目中出現一些未知異常,需要用到很詳細的日志資訊,此時如果項目中沒有動态改變日志級别的機制,排查問題将很棘手。

我們常用的一些日志系統包括:​<code>​Log4j2​</code>​、​<code>​Logback​</code>​、​<code>​Java Util Logging​</code>​;我們想動态改變日志的級别,前提是這些日志系統都支援我們直接設定日志等級,當然這些系統提供了很簡單的接口;

Log4j2

Logback

Java Util Logging

當然除了上面直接設定日志級别的方式,也有可以動态加載配置檔案的方式,同樣也可以在配置檔案中動态改變日志級别,以logback為例:

上面簡單介紹了一下每種日志系統都是如何去設定日志級别的,最關鍵的是設定完之後,可以實時生效,立馬可以看到我們想要的日志;有了這些下面其實就是通過何種方式去改變日志級别的問題了;

如何去動态改變級别,最簡單的方式就是對外提供一個接口,給定一個日志級别作為參數實時變更;或者通過配置中心的方式;另外其實像SpringBoot這些主流的架構本身也提供了動态修改的功能;下面可以具體看一下是如何實作的,以logback為例;

自定義一個給定日志級别的接口,外部直接通過調用接口來改變級别:

想要改變日志級别直接請求如下位址即可,設定一個debug的級别:

http://[ip]:[port]/logLevel/debug

這種方式雖然比較簡單,但是如果節點很多的話,操作起來就很麻煩,當然也可以彙總所有節點路徑,一次操作觸發所有節點的請求;其實最好的辦法應該是類似釋出訂閱的方式,釋出者會給所有訂閱者都發送一個更改日志級别的通知,有新的節點隻要成為訂閱者即可,這種方式其實就是現在主流的配置中心的方式。

配置中心的目的其實就是把一些會經常變動的參數集中儲存起來,某個系統啟動時去配置中心擷取相關的參數,同時會對這些參數進行監聽,後面在配置中心裡面改變參數的值會實時推送給相關系統;這樣系統就可以在不重新開機的情況下就更新了配置;

利用現有的一些中間件我們就能很快實作一個配置中心,比如Zookeeper提供了對某個Node進行監聽的功能,MQ和Redis都有釋出訂閱的功能,是以用來實時推送變更再好不過了;

Zookeeper方式

可以直接使用PathChildrenCache用來監聽子節點的CHILD_ADDED,CHILD_UPDATED,CHILD_REMOVED事件;這樣如果在Zookeeper服務端對節點的值就行更新,用戶端會觸發以上三個事件:

MQ一般都有Queue和Topic方式,Topic方式其實就是訂閱釋出模式,所有的叢集節點可以訂閱某個Topic,這樣釋出端發送更新日志級别的消息,其他訂閱節點都能收到:

Redis其實除了緩存的功能,也提供了類似MQ的釋出訂閱的模式;叢集節點通過訂閱一個channel,釋出端通過此channel來釋出消息:

SpringBoot2.0之後可以通過actuator動态調整日志級别,主要是通過暴露loggers這個endpoint來實作,具體步驟如下:

需要引入actuator

暴露loggers

在application.properties中添加如下配置:

檢視日志級别

啟動服務可以通過:

http://[ip]:[port]/actuator/loggers

檢視目前項目每個包的日志級别:

動态修改日志級别

發送POST請求到:

http://[ip]:[port]/actuator/loggers/[包路徑]

需要在body中指定configuredLevel參數;

比如修改整個項目日志級别為error:

http://[ip]:[port]/actuator/loggers/root
如何動态改變日志級别

關于SpringBoot内部是如何實作動态改變日志級别的,可以檢視其實作核心類LoggersEndpoint:

具體通過LoggingSystem來對日志系統動态改變級别,上面也介紹了主流使用的日志系統,SpringBoot也都支援這些系統,這是一個抽象類,具體實作類:

JavaLoggingSystem

Log4J2LoggingSystem

LogbackLoggingSystem

NoOpLoggingSystem

分别對應了幾種日志系統,這幾個類内部其實也是調用上面介紹的方法去改變日志級别,當然SpringBoot自動會識别出目前使用的是哪個日志系統,然後使用哪個LoggingSystem;

大部分公司其實更多的還是使用配置中心的方式來動态改變日志級别,這種方式更加靈活,而且配置中心已經成為很多公司的标配元件,不光用來改變日志級别,所有有可能改變的參數都可以使用。