基于 Nacos 配置中心的动态日志配置方案
log4j2 日志的级别不能落
SpringBoot 动态设置 logback 日志的级别
上面这两篇文章只是从技术角度说了,可以实现动态日志配置。但是并没有形成适用生产环境使用的方案。今天介绍一种基于 Nacos 配置中心的动态配置日志级别的方案。
0x01:安装 Nacos 配置中心
配置中心 Nacos 的官网
官网:https://nacos.io/zh-cn/docs/quick-start.html
下载安装包
需要注意一下 Nacos 需要 64 位操作系统和 64 位的JDK,如果不是 64 位的启动时会出现以下异常。
at com.alipay.sofa.jraft.core.NodeImpl.init(NodeImpl.java:138)at com.alipay.sofa.jraft.RaftServiceFactory.createAndInitRaftNode(RaftServiceFactory.java:47)at com.alipay.sofa.jraft.RaftGroupService.start(RaftGroupService.java:129)at com.alibaba.nacos.core.distributed.raft.JRaftServer.createMultiRaftGroup(JRaftServer.java:268)at com.alibaba.nacos.core.distributed.raft.JRaftProtocol.addRequestProcessors(JRaftProtocol.java:163)at com.alibaba.nacos.naming.core.v2.service.impl.PersistentClientOperationServiceImpl.<init>(PersistentClientOperationServiceImpl.java:92)at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor.newInstance(Constructor.java:423)at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:175)... 57 common frames omitted
Caused by: java.lang.UnsupportedOperationException: Cannot determine JNI library name for ARCH='x86' OS='windows 10' name='rocksdb'at org.rocksdb.util.Environment.getJniLibraryName(Environment.java:88)at org.rocksdb.NativeLibraryLoader.<clinit>(NativeLibraryLoader.java:19)... 74 common frames omitted
启动命令
startup.cmd -m standalone
因为启动脚本默认使用集群模式启动,为了不需要使用命令还,改动一下启动脚本,修改如下
启动成功,显示如下日志
2021-05-14 22:00:34,140 INFO Initializing ExecutorService ‘taskScheduler’
2021-05-14 22:00:34,178 INFO Exposing 16 endpoint(s) beneath base path ‘/actuator’
2021-05-14 22:00:34,465 INFO Tomcat started on port(s): 8848 (http) with context path ‘/nacos’
2021-05-14 22:00:34,473 INFO Nacos started successfully in stand alone mode. use embedded storage
访问 Nacos 配置中心,对应的账号和密码 nacos / nacos
http://192.168.10.6:8848/nacos/index.html
0x02: 在配置中心创建配置文件 dynamics-log.json
内容如下
{"logger": [{"name":"ROOT","level":"debug"}]
}
0x03:pom.xml 文件引入依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.olive</groupId><artifactId>valid-demo</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.8.RELEASE</version><relativePath /> </parent><name>valid-demo</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>0.5.0</version></dependency></dependencies>
</project>
主要多引入 Nacos 客户端(nacos-client )依赖
0x04:编译监听器
要达到动态的效果,一般有 PUSH 和 PULL 两种方式。Nacos 内部提供了监听器,只要实现相关方法就可以对不同的 data-id 进行监听。大致代码如下:
import java.util.concurrent.Executor;import javax.annotation.PostConstruct;import org.springframework.context.annotation.Configuration;import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;@Configuration
public class LoggerDynamicsConfig {private String serverAddr = "127.0.0.1:";private String dataId = "dynamics-log.json";private String group = "DEFAULT_GROUP";private long timeoutMs = 50000L;@PostConstructpublic void init() {try {ConfigService configService = NacosFactory.createConfigService(serverAddr);String configInfo = configService.getConfig(dataId, group, timeoutMs);System.out.println("configInfo = " + configInfo); configService.addListener(dataId, group, new Listener() {@Overridepublic void receiveConfigInfo(String configInfo) {System.out.println("recieve configInfo : " + configInfo);}@Overridepublic Executor getExecutor() {return null;}});} catch (NacosException e) {e.printStackTrace();}}
}
启动服务,可以看到控制台打印如下日志,说明可以获取到 Nacos 配置中心的配置项。
2021-05-14 22:13:56.265 [main] INFO c.alibaba.nacos.client.identify.CredentialWatcher - [] [] [] No credential found
configInfo = {"logger": [{"name":"ROOT","level":"debug"}]
}
recieve configInfo : {"logger": [{"name":"ROOT","level":"debug"}]
}
2021-05-14 22:13:56.563 [main] INFO o.s.scheduling.concurrent.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'
动态在 Nacos 配置中心修改一下,可以看到控制台打印如下日志,说明服务是可以动态监听到配置的改变的。
recieve configInfo : {"logger": [{"name":"ROOT","level":"debug"}, {"name":"com.spring","level":"info"}]
}
0x05:动态日志改造说明
在 receiveConfigInfo() 方法中,把拿到的配置 json 串构造成一个对象数组,比如定义为 LoggerConfig[]。
基于 [ SpringBoot 动态设置 logback 日志的级别 ] 改造,把 LoggerController 的 printAllLogger() 方法改成一个获取所有日志对象的方法,比如
public List<Logger> getAllLogger(){//TODO}
对配置动态变化构造的 LoggerConfig[] 数组与调用 getAllLogger() 获取的所有日志对象进行遍历比较,进行动态更新
基于 Nacos 配置中心的动态日志配置方案相关推荐
- Nacos + Spring Cloud Gateway动态路由配置
前言 Nacos最近项目一直在使用,其简单灵活,支持更细粒度的命令空间,分组等为麻烦复杂的环境切换提供了方便:同时也很好支持动态路由的配置,只需要简单的几步即可.在国产的注册中心.配置中心中比较突出, ...
- Spring 与 Log4J 进行动态日志配置切换
引言: 在开发与生产环境中,我们有时候需要对日志的配置进行动态切换,要调试.监控和检查系统的运行时信息. 一般有两种方法 1.通过 Spring 的 Log4jConfigLi ...
- 用Spring与Log4J进行动态日志配置切换
利用 Spring 与 Log4J 巧妙地进行动态日志配置切换并立即生效 引言: 在开发与生产环境中,我们有时候需要对日志的配置进行动态切换,要调试.监控和检查系统的运行时信息. 一般有两种方法 1. ...
- Nacos配置中心-加载多配置集
同时加载多个配置集 1).微服务任何配置信息,任何配置文件都可以放在配置中心中 2).只需要在bootstrap.properties说明加载配置中心中哪些配置文件即可 3).@Value,@Conf ...
- ENSP配置 实例九 动态Nat配置
ENSP配置 实例九 动态Nat配置 sy [Huawei]sy R1 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 192.168.1.254 24 ...
- apollo 配置中心 支持php,Apollo 配置中心详解
Apollo 配置中心产生背景 大多情况下程序随着功能的复杂,程序的配置也会增多:包括各种功能的开关.参数的配置.服务器的地址配置等等,同时开发人员对程序配置的期望值也越来越高:配置修改后实时生效,灰 ...
- SpringCloud config 配置中心介绍与基本配置使用
一.SpringCloud Config 介绍 出现背景:在微服务架构中,在没有配置中心出现时,我们每个应用的配置信息都在其配置文件application.properties中维护.加入整个系统中有 ...
- 【Apollo配置中心】Apollo环境配置
一.简介 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理 ...
- springboot 默认日志配置以及更换其他日志配置
springboot 默认日志配置 最简单的打印Sql日志 方法一 此方法无需改动直接复制即可使用 #打印SQL mybatis.configuration.log-impl=org.apache.i ...
最新文章
- 90%的Java工程师都不了解的线程池细节问题!
- 《linux 内核全然剖析》 mktime.c
- [Unity优化]overdraw01:不可见遮罩
- python 一次输入10个数_python 如何一次输入3个整数
- c#多线程同步之EventWaitHandle使用
- kaggle使用笔记
- 一周试用yii开发一个带各种该有功能的web程序(二)
- 表达式转换成后缀表达式进行计算
- 一站式快速实现应用现代化,IBM Cloud Pak做对了什么? | 技术公开课
- Docker 容器的通信(十二)
- 《C专家编程》笔记——第一章
- 康托尔集合论-罗素悖论-公理化集合论-不完全性定理
- 【Shior学习】subject和session
- pentestbox基础设置
- 主流消费级固态硬盘SSD接口
- 紫光信息港 软件测试,紫光展锐 信息化软件工程师面经
- 利用ipv6技术,废旧笔记本变成互联网server
- 小球碰壁反弹加分_canvas实现碰壁反弹(小球)
- 如何下载唐山市卫星地图高清版大图
- 大多数开发人员都不知道的JSON.stringify 秘密
热门文章
- 11个中最大的10个数字
- html中text的maxlength,HTML Input Text maxLength用法及代码示例
- 网购的家用摄像头质量怎么样
- 四年级数学上册计算机教案,最新人教版四年级上册数学全册教学案
- OneNote 2016无法登陆
- 一步一步教你写一个快递查询APP(适合新手)
- oracle客户关系系统,Java swing Oracle实现的客户关系管理系统项目源码附带详细设计文档...
- 深度学习||写论文思路整理||论文阅读的技巧
- 时间工具类(时间戳转换日期date,获取两个时间戳的日期)
- linux复制文件夹排除文件,【linux】复制文件夹中文件,排除部分文件