SpringBoot監(jiān)聽Nacos動(dòng)態(tài)修改日志級(jí)別的操作方法
線上系統(tǒng)的日志級(jí)別一般都是 INFO 級(jí)別,有時(shí)候需要查看 WARN 級(jí)別的日志,所以需要?jiǎng)討B(tài)修改日志級(jí)別。微服務(wù)項(xiàng)目中使用 Nacos 作為注冊(cè)中心,我們可以監(jiān)聽 Nacos 配置,修改日志級(jí)別。
一、pom文件
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.18</version> </dependency> <!--注冊(cè)中心客戶端--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2021.0.4.0</version> </dependency> <!--配置中心客戶端--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2021.0.4.0</version> </dependency> <!--Lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency>
二、項(xiàng)目配置文件增加如下內(nèi)容
nacos: config: # 配置文件 filename: nacos-provider-log-level.json # 配置GROUP group: DEFAULT_GROUP # 配置項(xiàng)key log: level: log.level
三、日志配置文件
{ "log.level":"info" }
四、日志監(jiān)聽類
import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.PropertyKeyConst; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.config.listener.Listener; import com.alibaba.nacos.api.exception.NacosException; import com.meng.backend.service.LogLevelChangeService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct; import java.util.Properties; import java.util.concurrent.Executor; /** * @Author: meng * @Description: 監(jiān)聽Nacos * @Date: 2023/6/5 9:52 * @Version: 1.0 */ @Slf4j @Configuration public class LoggerConfigListener { /** * 配置中心地址 */ @Value("${spring.cloud.nacos.discovery.server-addr}") private String serverAddr; /** * 命名空間ID */ // @Value("${nacos.config.namespace}") // private String namespace; /** * 配置文件 */ @Value("${nacos.config.filename}") private String dataId; /** * 配置GROUP */ @Value("${nacos.config.group}") private String group; /** * 配置項(xiàng)key */ @Value("${nacos.config.log.level}") private String logLevelName; @Autowired private LogLevelChangeService logLevelChangeService; /** * 動(dòng)態(tài)修改日志級(jí)別 */ @PostConstruct public void init() { try { log.info("init NacosConfigListener start..."); Properties properties = new Properties(); properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr); // properties.put(PropertyKeyConst.NAMESPACE, namespace); ConfigService configService = NacosFactory.createConfigService(properties); String content = configService.getConfig(dataId, group, 5000); if (StrUtil.isBlank(content)) { log.info("log config is empty"); return; } log.info("log config is :{}", content); configService.addListener(dataId, group, new Listener() { @Override public void receiveConfigInfo(String configInfo) { try { JSONObject jsonObject = JSONObject.parseObject(configInfo); Object levelObj = jsonObject.get(logLevelName); if (levelObj != null) { logLevelChangeService.changeLogLevel(levelObj.toString()); } } catch (Exception e) { log.error("receiveConfigInfo exception:", e); } } @Override public Executor getExecutor() { return null; } }); log.info("init NacosConfigListener end..."); } catch (NacosException e) { log.error("NacosConfigListener exception:{}", e.getMessage()); } } }
五、日志動(dòng)態(tài)修改服務(wù)類
/** * @Author: meng * @Description: 動(dòng)態(tài)調(diào)整日志級(jí)別 * @Date: 2023/6/5 9:56 * @Version: 1.0 */ public interface LogLevelChangeService { boolean changeLogLevel(String level); }
import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; import com.meng.backend.service.LogLevelChangeService; import lombok.extern.slf4j.Slf4j; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; /** * @Author: meng * @Description: 動(dòng)態(tài)調(diào)整日志級(jí)別 * @Date: 2023/6/5 9:56 * @Version: 1.0 */ @Slf4j @Service public class LogLevelChangeServiceImpl implements LogLevelChangeService { @Override public boolean changeLogLevel(String level) { try { log.info("level:{}", level); LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); Logger logger = loggerContext.getLogger("ROOT"); switch (level) { case "trace": logger.setLevel(Level.TRACE); break; case "debug": logger.setLevel(Level.DEBUG); break; case "info": logger.setLevel(Level.INFO); break; case "warn": logger.setLevel(Level.WARN); break; case "error": logger.setLevel(Level.ERROR); break; default: break; } return true; } catch (Exception e) { log.error("changeLogLevel exception:", e); return false; } } }
到此這篇關(guān)于SpringBoot監(jiān)聽Nacos動(dòng)態(tài)修改日志級(jí)別的文章就介紹到這了,更多相關(guān)SpringBoot動(dòng)態(tài)修改日志級(jí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot的類加載器(org.springframework.boot.loader)過程詳解
這篇文章主要介紹了springboot的類加載器(org.springframework.boot.loader),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Spring容器的創(chuàng)建過程之如何注冊(cè)BeanPostProcessor詳解
關(guān)于BeanPostProcessor 各位一定不陌生,今天整理的這篇文章總結(jié)了如何注冊(cè)BeanPostProcessor,文中有非常詳細(xì)的圖文示例,需要的朋友可以參考下2021-06-06Java實(shí)現(xiàn)正則匹配 “1234567” 這個(gè)字符串出現(xiàn)四次或四次以上
文章介紹了如何在Java中使用正則表達(dá)式匹配一個(gè)字符串四次或四次以上的出現(xiàn),首先創(chuàng)建正則表達(dá)式,然后使用Pattern和Matcher類進(jìn)行匹配和計(jì)數(shù),通過示例代碼展示了如何實(shí)現(xiàn)這一功能,并解釋了匹配的整體次數(shù)和精確出現(xiàn)次數(shù)的邏輯,感興趣的朋友一起看看吧2025-02-02詳解如何在SpringBoot中優(yōu)雅地重試調(diào)用第三方API
在實(shí)際的應(yīng)用中,我們經(jīng)常需要調(diào)用第三方API來獲取數(shù)據(jù)或執(zhí)行某些操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12什么情況下會(huì)出現(xiàn)java.io.IOException?:?Broken?pipe這個(gè)錯(cuò)誤以及解決辦法
這篇文章主要介紹了什么情況下會(huì)出現(xiàn)java.io.IOException?:?Broken?pipe這個(gè)錯(cuò)誤以及解決辦法的相關(guān)資料,這個(gè)錯(cuò)誤表示通信另一端已關(guān)閉連接,常發(fā)生在客戶端關(guān)閉連接、網(wǎng)絡(luò)超時(shí)或資源不足等情況,文中將解決辦法介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10圖文詳解java反射機(jī)制及常用應(yīng)用場(chǎng)景
這篇文章主要為大家介紹了圖文詳解java反射機(jī)制及常用應(yīng)用場(chǎng)景,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03