SpringBoot監(jiān)聽Nacos動態(tài)修改日志級別的操作方法
線上系統(tǒng)的日志級別一般都是 INFO 級別,有時候需要查看 WARN 級別的日志,所以需要動態(tài)修改日志級別。微服務(wù)項(xiàng)目中使用 Nacos 作為注冊中心,我們可以監(jiān)聽 Nacos 配置,修改日志級別。
一、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>
<!--注冊中心客戶端-->
<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;
/**
* 動態(tài)修改日志級別
*/
@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());
}
}
}五、日志動態(tài)修改服務(wù)類
/**
* @Author: meng
* @Description: 動態(tài)調(diào)整日志級別
* @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: 動態(tài)調(diào)整日志級別
* @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動態(tài)修改日志級別的文章就介紹到這了,更多相關(guān)SpringBoot動態(tài)修改日志級別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot的類加載器(org.springframework.boot.loader)過程詳解
這篇文章主要介紹了springboot的類加載器(org.springframework.boot.loader),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
Spring容器的創(chuàng)建過程之如何注冊BeanPostProcessor詳解
關(guān)于BeanPostProcessor 各位一定不陌生,今天整理的這篇文章總結(jié)了如何注冊BeanPostProcessor,文中有非常詳細(xì)的圖文示例,需要的朋友可以參考下2021-06-06
Java實(shí)現(xiàn)正則匹配 “1234567” 這個字符串出現(xiàn)四次或四次以上
文章介紹了如何在Java中使用正則表達(dá)式匹配一個字符串四次或四次以上的出現(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
什么情況下會出現(xiàn)java.io.IOException?:?Broken?pipe這個錯誤以及解決辦法
這篇文章主要介紹了什么情況下會出現(xiàn)java.io.IOException?:?Broken?pipe這個錯誤以及解決辦法的相關(guān)資料,這個錯誤表示通信另一端已關(guān)閉連接,常發(fā)生在客戶端關(guān)閉連接、網(wǎng)絡(luò)超時或資源不足等情況,文中將解決辦法介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10

