Logback.xml配置参数scanPeriod无效

问题概要:

logback可以实现自动刷新logback.xml配置,配置如下
<configuration scan=”true” scanPeriod=”10 seconds” debug=”true”>
</configuration >
参数描述:
scan=”true” 启动动态刷新
scanPeriod=”10 seconds” 刷新频率 10s每次
seconds” debug=”true” 开启动态刷新日志,有变动会触发日志
问题: 部分应用配置动态刷新无法生效
解决方案如下:

  • 第一步,百度,没有相关问题的解答

  • 第二步,去github上查看issues,没有相关答案,但找到如下线索,如下:

https://github.com/qos-ch/logback/pull/357

logback在2017年1月解决了一个logback动态刷新bug,找到了logback动态刷新的配置类,如下

logback-classic/src/main/java/ch/qos/logback/classic/joran/action/ConfigurationAction.java

  • 第三步,网络查询无果,决定阅读源码看看具体缘由,阅读源码果然找到了一个定时任务,代码如下:

//ch.qos.logback.classic.joran.action.ConfigurationAction

//119行:
ScheduledFuture<?> scheduledFuture = scheduledExecutorService.scheduleAtFixedRate(rocTask, duration.getMilliseconds(), duration.getMilliseconds(),TimeUnit.MILLISECONDS);

定时执行rocTask这个对象,看看该类run方法,发现如下代码,感觉像哪见过

//ch.qos.logback.classic.joran.ReconfigureOnChangeTask

@Override  public void run() {

.......................

List<File> filesToWatch = configurationWatchList.getCopyOfFileWatchList(); 
 if (filesToWatch == null || filesToWatch.isEmpty())
 {      
        addInfo("Empty watch file list. Disabling ");    
        return;  
}

.....................

}

对,控制台一直在刷这个日志,如下图

Logback.xml配置参数scanPeriod无效

我一直以为这个是项目的缘由,再看看自己写的demo并没有发现logback打印该日志。

所以决定调试,看看可以自动刷新的demo和不可刷新的CRM到底在logback刷新部分有哪里不同

  • 第四步,调试自己写的打印日志的demo(可以动态刷新)和CRM,结果如下

DEMO:

Logback.xml配置参数scanPeriod无效

看看其中有个mainURL很熟悉,应该就是在刷新这个变量的地址

CRM:

Logback.xml配置参数scanPeriod无效

此时奇怪的事情发生了,CRM中logback刷新的文件为rocketmq-client中的logback_rocketmq_client.xml

由此猜测,这个为logback本身的bug,猜测如下:

  • 1.logback可以加载多个日志配置文件
  • 2.logback加载的配置文件内容会合并
  • 3.配置了动态刷新,logback只刷新最后加载的logback配置文件

那又有个问题,理论上使用了rocketmq_client都有问题,但目前只是部分有问题。

分析结果如下:

高版本rocketmq_client(4.2及以上)中已经没有这个文件了

那如何验证和解决改问题? 想到的是如何排除rocketmq_client中的logback_rocketmq_client.xml,如下:

  • 1.logback是否有配置,固定指向logback.xml(百度无果,查看代码无果)
  • 2.rocketmq_client是否有配置切换日志指向(百度无果,查看代码有果)
  • 3.修改rocketmq_client的代码,去掉配置(自行维护rocket_client版本不友善)

rokcetmq_client代码如下:

//com.alibaba.rocketmq.client.log.ClientLogger

//46行:
Boolean isloadconfig =Boolean.parseBoolean(System.getProperty("rocketmq.client.log.loadconfig", "true"));

这就好办了,启动参数中直接关掉自动加载日志就ok, -Drocketmq.client.log.loadconfig=false

添加参数实验,实验成功

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...