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

目录

一、pom文件

二、项目配置文件

三、日志配置文件

四、日志监听类

五、日志动态修改服务类


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

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

nacos:config:# 配置文件filename: nacos-provider-log-level.json# 配置GROUPgroup: DEFAULT_GROUP# 配置项keylog:level: log.level

三、日志配置文件

{"log.level":"info"
}

四、日志监听类

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;@Autowiredprivate LogLevelChangeService logLevelChangeService;/*** 动态修改日志级别*/@PostConstructpublic 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() {@Overridepublic 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);}}@Overridepublic Executor getExecutor() {return null;}});log.info("init NacosConfigListener end...");}catch (NacosException e) {log.error("NacosConfigListener exception:{}", e.getMessage());}}}

五、日志动态修改服务类

/*** @Author: meng* @Description: 动态调整日志级别* @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: 动态调整日志级别* @Date: 2023/6/5 9:56* @Version: 1.0*/
@Slf4j
@Service
public class LogLevelChangeServiceImpl implements LogLevelChangeService {@Overridepublic 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;}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/197871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++面试宝典第2题:逆序输出整数

题目 写一个方法&#xff0c;将一个整数逆序打印输出到控制台。注意&#xff1a;当输入的数字含有结尾的0时&#xff0c;输出不应带有前导的0。比如&#xff1a;123的逆序输出为321&#xff0c;8600的逆序输出为68&#xff0c;-609的逆序输出为-906。 解析 这道题本身并没有什么…

Java架构师技术架构路线

目录 1 概论2 如何规划短中长期的技术架构路线图3 如何规划面向未来的架构4 如何修订路线图执行过程中的偏差5 如何落地路线图-阿里系糙快猛之下的敏捷模式想学习架构师构建流程请跳转:Java架构师系统架构设计 1 概论 首先,规划一个短中长期的技术路线图是非常重要的。短中…

java SSM毕业生信息管理myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

前言 学校的规模不断扩大&#xff0c;学生数量急剧增加&#xff0c;有关学生的各种信息量也成倍增长。面对庞大的信息量需要有学生信息管理系统来提高学生管理工作的效率。通过这样的系统可以做到信息的规范管理、科学统计和快速查询、修改、增加、删除等&#xff0c;从而减少管…

lv11 嵌入式开发 RTC 17

目录 1 RTC简介 ​编辑2 Exynos4412下的RTC控制器 2.1 概述 2.2 特征 2.3 功能框图 3 寄存器介绍 3.1 概述 3.2 BCD格式的年月日寄存器 3.3 INTP中断挂起寄存器 3.4 RTCCON控制寄存器 3.5 CURTICCNT 作为嘀嗒定时器使用的寄存器 4 RTC编程 5 练习 1 RTC简介 RTC(…

Ubuntu22.04安装Mariadb

安装Mariadb $ sudo apt update $ sudo apt install mariadb-server安装完后&#xff0c;可以用下面命令查看服务状态 $ sudo service mariadb status配置Mariadb 安装完mariadb后&#xff0c;可以使用mysql_secure_installation命令做一下安全配置 $ sudo mysql_secure_in…

关于优雅的使用SQL多行转多列的记录(doris)

文章目录 应用需求场景记录过程1. 准备数据2. 给数据根据姓名分组&#xff0c;加上序号.3. 根据name分组成map结构4. 拆分map 应用需求场景 准备的数据是这样的&#xff1a; 需要将每个人的成绩显示在一行上&#xff0c;需要的结果如下&#xff0c;但是我的情况是课程有非常…

联想LJ2655DN激光打印机清零方法

随着打印机的使用越来越频繁&#xff0c;需要更换耗材的时候也越来越多&#xff1b;但是更换上新的耗材后&#xff0c;很多用户都会遇到一个问题&#xff0c;就是更换完新的耗材后打印机仍然提示寿命将近&#xff0c;或者无墨粉盒灯情况&#xff0c;这个时候就需要我们对打印机…

【JavaSE】多线程(学习笔记)

一、多线程概述 进程&#xff1a;正在运行的程序 系统进行资源分配粒调用的独立单位每一个进程都有它自己的内存空间和系统资源 线程&#xff1a;进程中的单个顺序控制流&#xff0c;是一条执行路径 单线程&#xff1a;一条执行路径多线程&#xff1a;多条执行路径 二、多线…

qt 5.15.2 主窗体事件及绘制功能

qt 5.15.2 主窗体事件及绘制功能 显示主窗体效果图如下所示&#xff1a; main.cpp #include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.setFixedWidth(600);w.setFixedHeight(6…

Nat easy IP ACL

0表示匹配&#xff0c;1表示任意&#xff08;主机位0.0.0.255&#xff08;255主机位&#xff09;&#xff09; rule deny source 192.168.2.1 0 设置拒绝192.168.2.1的主机通过 记住将其应用到接口上 [AR2]acl 2000 //创建基本ACL [AR2-acl-basic-2000]rule deny source 192…

Fiddler的配置、原理和使用

一、Fiddler的工作原理 本地应用与服务器之间所有的请求&#xff08;request&#xff09;和响应&#xff08;response&#xff09;&#xff0c;由fiddler进行转发&#xff0c;此时fiddler以代理服务器的方式存在。 由于所有的网络数据都要经过fiddler&#xff0c;因此&#xf…

014 OpenCV canny边缘检测

一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、canny原理 OpenCV中的Canny边缘检测算法是一种基于图像处理的计算机视觉技术&#xff0c;主要用于检测图像中的边缘。Canny边缘检测算法的原理是通过计算图像中像素点之间的梯度值来…

ClickHouse(16)ClickHouse日志引擎Log详细解析

日志引擎系列 这些引擎是为了需要写入许多小数据量&#xff08;少于一百万行&#xff09;的表的场景而开发的。 这系列的引擎有&#xff1a; StripeLogLogTinyLog 共同属性 引擎&#xff1a; 数据存储在磁盘上。 写入时将数据追加在文件末尾。 不支持突变操作,也就是更新…

python开发案例教程-清华大学出版社(张基温)答案(3.1)

目录 练习 3.1 1、判断题 2、选择题 3、代码分析题 4、程序设计题 练习 3.1 1、判断题 (1) 函数定义可以嵌套。 (✔) (2) 函数调用可以嵌套。 …

SAP MIGO前台批次特性值增强(自动带出)<转载>

原文链接&#xff1a;https://blog.csdn.net/qq_45063256/article/details/128464411 增强点&#xff1a;程序LCTMSF3Z 在MIGO中点击批次右边的分类时&#xff0c;自动将该批次的批次特性值带出来。 现在打开程序LCTMSF3Z 该程序就只有一个FORM&#xff0c;首先切换到编辑…

AIGC: 关于ChatGPT中基于API实现一个StreamClient流式客户端

Java版GPT的StreamClient 可作为其他编程语言的参考注意: 下面包名中的 xxx 可以换成自己的代码基于java&#xff0c;来源于网络&#xff0c;可修改成其他编程语言实现参考前文: https://blog.csdn.net/Tyro_java/article/details/134748994 1 &#xff09;核心代码结构设计 …

RTLS 在医疗保健中使用的好处

实时定位系统 (RTLS) 和物联网 (IoT) 提供有关患者、医疗设备和工作人员的数据。 医疗保健管理员可以通过互联的生态系统改善患者和员工的体验&#xff0c;同时降低运营成本并提高效率。了解医疗保健系统如何使用 RTLS 以及如何实现优化物联网策略的优势。 定义医疗保健实时定…

加载预训练权重时不匹配

场景 复现Rethinking the Learning Paradigm for Dynamic Facial Expression Recognition这篇论文时&#xff0c;加载已经训练好的.pt文件进行推理&#xff0c;发现准确率很低。利用下面两行代码加载预训练的权重&#xff1a; weights_dict torch.load(/data2/liuxu/attribu…

3.C程序编译步骤

目录 1 预处理 2 编译 3 汇编 4 链接 5 文件大小情况 依次执行下面4个步骤 预处理 将所有头文件展开&#xff0c;比如stdio.h等&#xff0c;展开就相当于把stdio.h中的所有代码粘贴到你的代码里。将所有的宏文件展开&#xff0c;像stdio.h是官方定义的头文件&#x…

STM32F407-14.3.11-01互补输出和死区插入

互补输出和死区插入 高级控制定时器&#xff08;TIM1 和 TIM8&#xff09;可以输出两路互补信号&#xff0c;并管理输出的关断与接通瞬间。 这段时间通常称为死区&#xff0c;用户必须根据与输出相连接的器件及其特性&#xff08;电平转换器的固有延迟、开关器件产生的延迟...&…