修改Logback源码,实现canal日志输出当前Ip地址和文件夹

logback本身支持MDC,用户可以在应用中自己定义变量,然后在日志模板中使用,比如在应用启动的时候注册变量Ip和当前路径RootPath

最后输出的日志

在我们自己开发的应用中实现这样一些变量是完全没有问题的,但是如果我们使用第三方的框架,本身很难或者无法修改源码定义一些变量,比如flink,canal等。

特别是对于canal这种,我们需要部署很多个实例,但是一旦有实例报错,我们根本不知道是哪个程序的问题,也只能一个一个去看日志文件,如果在抛出异常的时候,就把本机ip和部署文件夹一起带出来,那么能够很快确定哪个应用。

研究一下logback的配置文件,细心一点我们会发现,定义的Pattern本身就是logback定义好的变量,如果我们能够扩展增加一些变量,那么就可以一劳永逸了。

开始了logback 1.2.3的debug之路。。。

先从我们使用的ch.qos.logback.classic.html.HTMLLayout这个类中进入,进去后进入父类start

没有,已经拿到了pattern 和我们配置的一摸一样,挨个进去

Parser<E> p = new Parser<E>(pattern);

实际上就是将pattern 挨个拆分,最终拿到的tokenList

接着进入getEffectiveConverterMap()

果然注册方法都在getDefaultConverterMap()中

最后找到这个方法在ch.qos.logback.classic下的PatternLayout

依葫芦画瓢,照着写吧

最后就是新增这两个方法,并在PatternLayout下的map中增加,就可以实现Ip RootPath 像date message等一样使用了。

改完打包编译,再将canal lib下的logback-classic文件替换,就可以愉快的在logback.xml中使用了。

最后可以这样

如果是单个项目觉得修改源码打包比较麻烦,其实在项目中新建相同的类也是可以的,这里利用到了java classpath加载顺序

 

posted @ 2019-09-30 16:46  博而不客  阅读(1425)  评论(0编辑  收藏  举报