问题概要:
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;
}
.....................
}
对,控制台一直在刷这个日志,如下图

我一直以为这个是项目的缘由,再看看自己写的demo并没有发现logback打印该日志。
所以决定调试,看看可以自动刷新的demo和不可刷新的CRM到底在logback刷新部分有哪里不同
- 第四步,调试自己写的打印日志的demo(可以动态刷新)和CRM,结果如下
DEMO:

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

此时奇怪的事情发生了,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"));