思路

利用Zookeeper监听机制,为一个节点添加监听器,当该节点发生变化时,更改日志级别。在本机和虚拟机上分别发布一套服务,连接同一个Zookeeper服务,在Zookeeper客户端修改节点的值,动态更改项目中日志级别

项目目录结构如下

说明:主要代码在LogbackListenerZKUtils

application.properties中只是更改了Tomcat端口号,zk.properties中配置了ZK启动参数等。

ZKUtils

@Component(value = "zkClient")
@PropertySource({"classpath:zk/zk.properties"})
public class ZKUtils {private static CuratorFramework client = null;private final static Logger log = LoggerFactory.getLogger(ZKUtils.class);@Value("${zk.host}")private String ZK_HOST;@Value("${zk.port}")private Integer ZK_PORT;@Value("${zk.retryPolicy.baseSleepTimeMS}")private Integer baseSleepTimeMS;@Value("${zk.retryPolicy.maxRetries}")private Integer maxRetries;@Value("${zk.sessionTimeoutMs}")private Integer sessionTimeoutMs;@Value("${zk.log.level.path}")private String path;      //监听节点的路径/*** 初始化*/public void init() {try {//创建重试策略RetryPolicy retryPolicy = new ExponentialBackoffRetry(baseSleepTimeMS, maxRetries);//创建zookeeper客户端client = CuratorFrameworkFactory.builder().connectString(ZK_HOST + ":" + ZK_PORT).sessionTimeoutMs(sessionTimeoutMs).retryPolicy(retryPolicy).build();client.start();/*** 设置监听节点**/final NodeCache nodeCache = new NodeCache(client, path);nodeCache.getListenable().addListener(() -> {ch.qos.logback.classic.LoggerContext loggerContext = (ch.qos.logback.classic.LoggerContext) LoggerFactory.getILoggerFactory();//得到Node数据String level = new String(nodeCache.getCurrentData().getData());loggerContext.getLogger("root").setLevel(ch.qos.logback.classic.Level.toLevel(level));log.info("日志级别更新:level = {}", level);});nodeCache.start();log.info("zookeeper初始化成功");} catch (Exception e) {log.error("zookeeper初始化失败");e.printStackTrace();}}
}

LogbackListener,项目启动时执行init

@Component
public class LogbackListener implements ServletContextListener {@Autowiredprivate ZKUtils zkUtils;@Overridepublic void contextInitialized(ServletContextEvent event) {zkUtils.init();}}

测试

在Zookeeper bin目录下运行zKServer.cmd,启动服务

运行springboot项目,查看日志

本机:

虚拟机

执行 java -jar tuzki-web-0.0.1-SNAPSHOT.jar

可以看到现在的日志级别都是INFO

在zkCli.cmd中,执行 set /zk debug,更改日志级别

由于为该节点设置了监听,当节点发生变化时,会执行ZKUtils监听器中的代码,更改日志级别

再次查看项目日志

至此,以实现动态更改日志级别

使用Zookeeper动态更改日志级别相关推荐

  1. glog 设置日志级别_如何动态改变日志级别

    前言 关于日志级别,大部分项目可能都设置为info级别,当然也可能有一些追求性能或者说包含很多敏感信息的项目直接将级别设置为warn或者error:这时候如果项目中出现一些未知异常,需要用到很详细的日 ...

  2. 如何动态改变日志级别

    前言 关于日志级别,大部分项目可能都设置为info级别,当然也可能有一些追求性能或者说包含很多敏感信息的项目直接将级别设置为warn或者error:这时候如果项目中出现一些未知异常,需要用到很详细的日 ...

  3. 更改日志级别_如何在运行时更改日志记录级别

    更改日志级别 在运行时中更改日志记录级别非常重要,这主要在生产环境中非常重要,在生产环境中,您可能希望在有限的时间内进行调试日志记录. 好了,更改根记录器非常简单–假设您有一个具有所需记录级别的输入参 ...

  4. SpringBoot动态修改日志级别

    前言 为了减少日志频繁打印带来的性能影响,线上环境设置的日志级别一般都相对较高.而当出现生产问题需要排查的时候,可能需要适当降低日志级别(例如DEBUG)来打印更多的日志信息帮助定位问题. 传统的做法 ...

  5. Spring Boot 2动态修改日志级别

    本文基于:Spring Boot 2.1.3,理论支持Spring Boot 2.x所有版本. 作为程序猿,定位问题是我们的日常工作,而日志是我们定位问题非常重要的依据.传统方式定位问题时,往往是如下 ...

  6. log4j2动态修改日志级别及拓展性使用

    一.供参考的完整日志配置 <?xml version="1.0" encoding="UTF-8"?><!-- 配置LoggerConfig, ...

  7. 使用RestTemplate模版实现 Rest 服务调用、Swagger 集成、动态修改日志级别

    Spring 与 Restful 整合才是微架构的核心,虽然在整个 SpringBoot(SpringCloud)之中提供有大量的 服务方便整合,但是这些 整合都不如 Rest 重要,因为 Rest ...

  8. 日志级别_SpringBoot实战(十三):Admin动态修改日志级别

    强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan [前言] 之前关于线上输出日志一直有个困惑:如何可以动态调整的日志级别,来保证系统在正常运行时性 ...

  9. 求你了,别再随便打日志了,教你动态修改日志级别!

    GitHub 19k Star 的Java工程师成神之路,不来了解一下吗! 之前写过一篇文章<明明有自动清理,日志还是把我的服务干爆了!>,介绍过一次大促故障,是因为日志量激增,导致服务器 ...

最新文章

  1. 从云端到边缘 AI推动FPGA应用拓展
  2. 清明是品茗的好时节,那么你了解quot;明前茶quot;吗?
  3. 使用 Google Calendar 免费自动发送手机短信、Email 的方法
  4. Spring冲刺计划会议
  5. C/C++ static和const关键字的作用
  6. jQuery学习笔记(简介,选择器)
  7. 深度理解python中的元类
  8. K8S部署工具:KubeOperator系统设置
  9. QT的QMutableListIterator类的使用
  10. iphone降级 无需电脑_88 元淘来的 iPhone 4 降级到 iOS 6,甚至还能跑 “大型游戏”...
  11. 腾讯围棋AI绝艺战胜DeepZenGo又夺一冠
  12. mysql开启远程可连接
  13. 【渝粤教育】广东开放大学 生产与运作管理 形成性考核 (36)
  14. 不同表_一个公式搞定数据信息按类别拆分到不同工作表
  15. android timepicker分割线颜色,Android TimePicker 的使用
  16. 立波 iphone3gs越狱教程:成功把iphone3gs手机升级成ios6.1.3系统,完美解决no service和耗电量大的问题...
  17. 天线开路短路检测原理_LEA-5S的天线开路检测问题
  18. APP全栈工程师修炼之路(一)
  19. 微场景:移动互联时代的营销革命
  20. 辽宁省省直个人住房公积金贷款指南

热门文章

  1. Matlab:可视化标量三维体数据的方法
  2. java Selenium2进行验证码识别
  3. 软件缺陷智能分析技术(2) - SZZ的基本流程
  4. 关于用.9.png格式处理图标失真问题
  5. Dominated Subarray
  6. 利用 colgroup保持表列宽度
  7. python commands_python2 commands简单用法
  8. commands 和 subprocess
  9. Win10电脑开机蓝屏多次重启无效怎么办?
  10. c语言mac小游戏,烧脑又有趣!苹果官方的「编程游戏」登陆Mac