修改Logback源码 输出IP地址和文件夹路径 超简单!
logback是log4j团队创建的开源日志组件,与log4j类似,但是比log4j更强大,可以看作是log4j的改良版本。当我们使用logback记录日志要想输出一些自定义数据,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加载顺序的捷径
讲清楚了在哪里改,修改源码增加自定义变量是不是超简单!