SpringBoot-监听Nacos动态修改日志级别

目录

一、pom文件

二、项目配置文件

三、日志配置文件

四、日志监听类

五、日志动态修改服务类


线上系统的日志级别一般都是 INFO 级别,有时候需要查看 WARN 级别的日志,所以需要动态修改日志级别。微服务项目中使用 Nacos 作为注册中心,我们可以监听 Nacos 配置,修改日志级别。

一、pom文件

bash 复制代码
		<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>

二、项目配置文件增加如下内容

bash 复制代码
nacos:
  config:
    # 配置文件
    filename: nacos-provider-log-level.json
	# 配置GROUP
    group: DEFAULT_GROUP
	# 配置项key
    log:
      level: log.level

三、日志配置文件

bash 复制代码
{
    "log.level":"info"
}

四、日志监听类

java 复制代码
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: 监听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;

	/**
	 * 配置项key
	 */
	@Value("${nacos.config.log.level}")
	private String logLevelName;

	@Autowired
	private LogLevelChangeService logLevelChangeService;

	/**
	 * 动态修改日志级别
	 */
	@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());
		}

	}

}

五、日志动态修改服务类

java 复制代码
/**
 * @Author: meng
 * @Description: 动态调整日志级别
 * @Date: 2023/6/5 9:56
 * @Version: 1.0
 */
public interface LogLevelChangeService {

	boolean changeLogLevel(String level);

}
java 复制代码
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: 动态调整日志级别
 * @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;
		}
	}

}
相关推荐
麦兜*1 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
KK溜了溜了1 小时前
JAVA-springboot 整合Redis
java·spring boot·redis
大只鹅2 小时前
解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题
spring boot·后端·elasticsearch
天河归来2 小时前
使用idea创建springboot单体项目
java·spring boot·intellij-idea
IT_10242 小时前
Spring Boot项目开发实战销售管理系统——数据库设计!
java·开发语言·数据库·spring boot·后端·oracle
武昌库里写JAVA3 小时前
Oracle如何使用序列 Oracle序列使用教程
java·开发语言·spring boot·学习·课程设计
超级小忍4 小时前
Spring Boot 中常用的工具类库及其使用示例(完整版)
spring boot·后端
程序员张34 小时前
SQL分析与打印-p6spy组件
spring boot·sql·mybatis·mybatisplus·p6spy
CHENWENFEIc4 小时前
SpringBoot论坛系统安全测试实战报告
spring boot·后端·程序人生·spring·系统安全·安全测试
代码老y7 小时前
Spring Boot + 本地部署大模型实现:优化与性能提升
java·spring boot·后端