SpringBoot動態修改日志級別的操作
前言
為瞭減少日志頻繁打印帶來的性能影響,線上環境設置的日志級別一般都相對較高。而當出現生產問題需要排查的時候,可能需要適當降低日志級別(例如DEBUG)來打印更多的日志信息幫助定位問題。
傳統的做法一般是:
1、配置裡修改日志級別
2、重啟應用
3、問題復現查看報錯日志排查問題
這個過程需要重啟應用,比較麻煩,效率較低,而且針對大型在線項目,不可能隨便停機重啟。那麼有沒有一種方式在不重啟應用的情況下實現動態修改日志級別呢?
下面,讓老萬教你如何通過SpringBoot的actuator組件來實現動態修改日志級別。
一、添加依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
二、配置actuator暴露的端口
#啟用actuator端口 management.endpoints.enabled-by-default=fasle #設置actuator的訪問根路徑,默認是/actuator management.endpoints.web.base-path=/message #啟用的端點 management.endpoints.web.exposure.include=loggers
這裡我修改瞭actuator的默認訪問路徑/actuator,改為/message,為的是和項目的基礎訪問路徑保存一致。
啟用端口的2中配置方法:
方式一:(推薦)
management.endpoints.web.exposure.include=loggers
方式二:(這種方式測試沒有生效)
management.endpoint.loggers.enabled=true
補充:如何禁用info端口
management.endpoints.enabled-by-default=false management.endpoint.info.enabled=true
關於actuator組件被稱為spring boot的4大組件之一,功能強大,大傢在網上自己找些資料進一步瞭解。
actuator的endpoint端口說明:
ID | 描述 | 默認啟用 |
---|---|---|
auditevents | 顯示當前應用程序的審計事件信息 | Yes |
beans | 顯示一個應用中所有Spring Beans的完整列表 | Yes |
conditions | 顯示配置類和自動配置類(configuration and auto-configuration classes)的狀態及它們被應用或未被應用的原因 | Yes |
configprops | 顯示一個所有@ConfigurationProperties的集合列表 | Yes |
env | 顯示來自Spring的 ConfigurableEnvironment的屬性 | Yes |
flyway | 顯示數據庫遷移路徑,如果有的話 | Yes |
health | 顯示應用的健康信息(當使用一個未認證連接訪問時顯示一個簡單的’status’,使用認證連接訪問則顯示全部信息詳情) | Yes |
info | 顯示任意的應用信息 | Yes |
liquibase | 展示任何Liquibase數據庫遷移路徑,如果有的話 | Yes |
metrics | 展示當前應用的metrics信息 | Yes |
mappings | 顯示一個所有@RequestMapping路徑的集合列表 | Yes |
scheduledtasks | 顯示應用程序中的計劃任務 | Yes |
sessions | 允許從Spring會話支持的會話存儲中檢索和刪除(retrieval and deletion)用戶會話。使用Spring Session對反應性Web應用程序的支持時不可用。 | Yes |
shutdown | 允許應用以優雅的方式關閉(默認情況下不啟用) | No |
threaddump | 執行一個線程dump | Yes |
如果使用web應用(Spring MVC, Spring WebFlux, 或者 Jersey),你還可以使用以下端點:
ID | 描述 | 默認啟用 |
---|---|---|
heapdum | 返回一個GZip壓縮的hprof堆dump文件 | Yes |
jolokia | 通過HTTP暴露JMX beans(當Jolokia在類路徑上時,WebFlux不可用) | Yes |
logfile | 返回日志文件內容(如果設置瞭logging.file或logging.path屬性的話),支持使用HTTP Range頭接收日志文件內容的部分信息 | Yes |
prometheus | 以可以被Prometheus服務器抓取的格式顯示metrics信息 | Yes |
要更改公開哪些端點,請使用以下技術特定的include和exclude屬性:
Property | Default |
---|---|
management.endpoints.jmx.exposure.exclude | * |
management.endpoints.jmx.exposure.include | * |
management.endpoints.web.exposure.exclude | * |
management.endpoints.web.exposure.include | info, health |
include
屬性列出瞭公開的端點的ID,
exclude
屬性列出瞭不應該公開的端點的ID
exclude
屬性優先於include屬性。包含和排除屬性都可以使用端點ID列表進行配置。
*可以用來選擇所有端點。
例如,要通過HTTP公開除env和beans端點之外的所有內容,請使用以下屬性:
management.endpoints.web.exposure.include=* management.endpoints.web.exposure.exclude=env,beans
三、關閉鑒權
一般我們會將actuator和spring security鑒權組件結合使用,防止這些功能端口被隨便調用。由於這裡是功能演示,先放開actuator相關端口的權限認證。
此外,如果存在Spring Security,則需要添加自定義安全配置,以允許對端點進行未經身份驗證的訪問,如以下示例所示:放開所有Endpoint端點進行匹配
@Configuration public class ActuatorSecurity extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests() .anyRequest().permitAll() } }
四 、通過/loggers端口查看日志級別
請求鏈接:http://localhost:8090/message/loggers
註意上面我說過的,我調整瞭management.endpoints.web.base-path=/message。如果沒有設置此參數,則使用默認的/actuator去訪問。
五、發起http請求修改日志級別
這裡演示,修改目錄com.wxswj.provider.message.controller的日志級別為debug
請求類型為POST,參數格式是JSON
curl -H "Content-Type: application/json" -X POST --data ' { "configuredLevel": "DEBUG" } ' http://localhost:8090/message/loggers/com.wxswj.provider.message.controller
大傢可以在服務器上通過curl發起http請求,或者通過Postman發起請求。
curl -H "Content-Type: application/json" -X POST --data '{"configuredLevel": "DEBUG"}' http://localhost:8090/loggers/com.wxswj.provider.message.controller
六、查詢日志級別修改結果
http://localhost:8090/message/loggers/com.wxswj.provider.message.controller
{ "configuredLevel": "DEBUG", "effectiveLevel": "DEBUG" }
說明我們的修改日志級別的請求生效。
總結
通過整合spring boot的actuator組件,公開對應的/loggers端口,我們就可以輕松的實現動態調整系統的日志級別,而不用項目重啟。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- springboot動態調整日志級別的操作大全
- SpringBoot Actuator未授權訪問漏洞修復詳解
- Spring Boot Actuator管理日志的實現
- SpringBoot之如何正確、安全的關閉服務
- SpringBoot 指標監控actuator的專題