SpringBoot監(jiān)聽(tīng)Nacos動(dòng)態(tài)修改日志級(jí)別的操作方法
線(xiàn)上系統(tǒng)的日志級(jí)別一般都是 INFO 級(jí)別,有時(shí)候需要查看 WARN 級(jí)別的日志,所以需要?jiǎng)討B(tài)修改日志級(jí)別。微服務(wù)項(xiàng)目中使用 Nacos 作為注冊(cè)中心,我們可以監(jiān)聽(tīng) 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è)中心客戶(hù)端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.0.4.0</version>
</dependency>
<!--配置中心客戶(hù)端-->
<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)聽(tīng)類(lèi)
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)聽(tīng)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ù)類(lèi)
/**
* @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)聽(tīng)Nacos動(dòng)態(tài)修改日志級(jí)別的文章就介紹到這了,更多相關(guān)SpringBoot動(dòng)態(tài)修改日志級(jí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot使用slf4j日志并輸出到文件中的操作方法
- Java?SpringBoot項(xiàng)目如何優(yōu)雅的實(shí)現(xiàn)操作日志記錄
- SpringBoot使用AOP記錄接口操作日志的方法
- SpringBoot接入輕量級(jí)分布式日志框架(GrayLog)的操作方法
- springboot動(dòng)態(tài)調(diào)整日志級(jí)別的操作大全
- springBoot啟動(dòng)輸出三行日志控制臺(tái)自動(dòng)停止操作
- SpringBoot項(xiàng)目中控制臺(tái)日志的保存配置操作
- 在SpringBoot中記錄用戶(hù)操作日志功能
相關(guān)文章
springboot普通類(lèi)中如何獲取session問(wèn)題
這篇文章主要介紹了springboot普通類(lèi)中如何獲取session問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
springboot的類(lèi)加載器(org.springframework.boot.loader)過(guò)程詳解
這篇文章主要介紹了springboot的類(lèi)加載器(org.springframework.boot.loader),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
Spring容器的創(chuàng)建過(guò)程之如何注冊(cè)BeanPostProcessor詳解
關(guān)于BeanPostProcessor 各位一定不陌生,今天整理的這篇文章總結(jié)了如何注冊(cè)BeanPostProcessor,文中有非常詳細(xì)的圖文示例,需要的朋友可以參考下2021-06-06
Java實(shí)現(xiàn)正則匹配 “1234567” 這個(gè)字符串出現(xiàn)四次或四次以上
文章介紹了如何在Java中使用正則表達(dá)式匹配一個(gè)字符串四次或四次以上的出現(xiàn),首先創(chuàng)建正則表達(dá)式,然后使用Pattern和Matcher類(lèi)進(jìn)行匹配和計(jì)數(shù),通過(guò)示例代碼展示了如何實(shí)現(xiàn)這一功能,并解釋了匹配的整體次數(shù)和精確出現(xiàn)次數(shù)的邏輯,感興趣的朋友一起看看吧2025-02-02
詳解如何在SpringBoot中優(yōu)雅地重試調(diào)用第三方API
在實(shí)際的應(yīng)用中,我們經(jīng)常需要調(diào)用第三方API來(lái)獲取數(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ā)生在客戶(hù)端關(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

