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 配置中心的动态日志配置方案相关推荐

  1. Nacos + Spring Cloud Gateway动态路由配置

    前言 Nacos最近项目一直在使用,其简单灵活,支持更细粒度的命令空间,分组等为麻烦复杂的环境切换提供了方便:同时也很好支持动态路由的配置,只需要简单的几步即可.在国产的注册中心.配置中心中比较突出, ...

  2. Spring 与 Log4J 进行动态日志配置切换

    引言:     在开发与生产环境中,我们有时候需要对日志的配置进行动态切换,要调试.监控和检查系统的运行时信息.     一般有两种方法     1.通过 Spring 的 Log4jConfigLi ...

  3. 用Spring与Log4J进行动态日志配置切换

    利用 Spring 与 Log4J 巧妙地进行动态日志配置切换并立即生效 引言: 在开发与生产环境中,我们有时候需要对日志的配置进行动态切换,要调试.监控和检查系统的运行时信息. 一般有两种方法 1. ...

  4. Nacos配置中心-加载多配置集

    同时加载多个配置集 1).微服务任何配置信息,任何配置文件都可以放在配置中心中 2).只需要在bootstrap.properties说明加载配置中心中哪些配置文件即可 3).@Value,@Conf ...

  5. ENSP配置 实例九 动态Nat配置

    ENSP配置 实例九 动态Nat配置 sy [Huawei]sy R1 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 192.168.1.254 24 ...

  6. apollo 配置中心 支持php,Apollo 配置中心详解

    Apollo 配置中心产生背景 大多情况下程序随着功能的复杂,程序的配置也会增多:包括各种功能的开关.参数的配置.服务器的地址配置等等,同时开发人员对程序配置的期望值也越来越高:配置修改后实时生效,灰 ...

  7. SpringCloud config 配置中心介绍与基本配置使用

    一.SpringCloud Config 介绍 出现背景:在微服务架构中,在没有配置中心出现时,我们每个应用的配置信息都在其配置文件application.properties中维护.加入整个系统中有 ...

  8. 【Apollo配置中心】Apollo环境配置

    一.简介 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理 ...

  9. springboot 默认日志配置以及更换其他日志配置

    springboot 默认日志配置 最简单的打印Sql日志 方法一 此方法无需改动直接复制即可使用 #打印SQL mybatis.configuration.log-impl=org.apache.i ...

最新文章

  1. 90%的Java工程师都不了解的线程池细节问题!
  2. 《linux 内核全然剖析》 mktime.c
  3. [Unity优化]overdraw01:不可见遮罩
  4. python 一次输入10个数_python 如何一次输入3个整数
  5. c#多线程同步之EventWaitHandle使用
  6. kaggle使用笔记
  7. 一周试用yii开发一个带各种该有功能的web程序(二)
  8. 表达式转换成后缀表达式进行计算
  9. 一站式快速实现应用现代化,IBM Cloud Pak做对了什么? | 技术公开课
  10. Docker 容器的通信(十二)
  11. 《C专家编程》笔记——第一章
  12. 康托尔集合论-罗素悖论-公理化集合论-不完全性定理
  13. 【Shior学习】subject和session
  14. pentestbox基础设置
  15. 主流消费级固态硬盘SSD接口
  16. 紫光信息港 软件测试,紫光展锐 信息化软件工程师面经
  17. 利用ipv6技术,废旧笔记本变成互联网server
  18. 小球碰壁反弹加分_canvas实现碰壁反弹(小球)
  19. 如何下载唐山市卫星地图高清版大图
  20. 大多数开发人员都不知道的JSON.stringify 秘密

热门文章

  1. 11个中最大的10个数字
  2. html中text的maxlength,HTML Input Text maxLength用法及代码示例
  3. 网购的家用摄像头质量怎么样
  4. 四年级数学上册计算机教案,最新人教版四年级上册数学全册教学案
  5. OneNote 2016无法登陆
  6. 一步一步教你写一个快递查询APP(适合新手)
  7. oracle客户关系系统,Java swing Oracle实现的客户关系管理系统项目源码附带详细设计文档...
  8. 深度学习||写论文思路整理||论文阅读的技巧
  9. 时间工具类(时间戳转换日期date,获取两个时间戳的日期)
  10. linux复制文件夹排除文件,【linux】复制文件夹中文件,排除部分文件