使用Zookeeper动态更改日志级别

思路

利用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 {

    @Autowired
    private ZKUtils zkUtils;


    @Override
    public 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监听器中的代码,更改日志级别

再次查看项目日志

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Zookeeper Canary是用于测试ZooKeeper节点是否正常的心跳服务。在引用的内容中提到,Canary无法连接其他服务的客户端,导致报错。而连接zk可以看到,这个/cloudera_manager_zookeeper_canary节点是由Cloudera Manager创建的。 根据你提供的信息,你设置的日志路径是/data/log/zookeeper/,但这个路径下的日志文件没有写入最新的日志,最新的日志是2月份的。为了解决这个问题,你可以按照以下步骤进行排查: 1. 首先,确认一下ZooKeeper的配置文件中是否正确设置了日志文件路径。你可以打开ZooKeeper的配置文件,查找log.dir属性是否设置为/data/log/zookeeper/。 2. 接着,检查一下ZooKeeper日志级别是否设置为足够详细的级别。如果日志级别设置得太低,可能会导致日志记录不完整。你可以在配置文件中找到log.level属性,并将其设置为较高的级别,例如DEBUG。 3. 然后,检查一下ZooKeeper日志文件是否具有写入权限。确保/data/log/zookeeper/路径下的日志文件对ZooKeeper进程有写入权限,否则ZooKeeper将无法写入最新的日志。 4. 最后,重启ZooKeeper服务,以使配置的更改生效。重启后,观察日志文件是否开始记录最新的日志。 通过按照上述步骤进行排查,你应该能够找到ZooKeeper Canary不写入最新日志的原因,并解决这个问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ClouderaManager中ZooKeeper Canary挂掉](https://blog.csdn.net/LiHaoHang6/article/details/108665254)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [ZooKeeper Canary](https://blog.csdn.net/cclovezbf/article/details/124636373)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值