vlambda博客
学习文章列表

修改Logback源码 输出IP地址和文件夹路径 超简单!


logback是log4j团队创建的开源日志组件,与log4j类似,但是比log4j更强大,可以看作是log4j的改良版本。当我们使用logback记录日志要想输出一些自定义数据,logback本身是支持MDC的,用户可以在应用中自己定义变量,然后在日志模板中使用,比如在应用启动的时候注册变量Ip和当前路径RootPath

修改Logback源码 输出IP地址和文件夹路径 超简单!

最后输出的日志

修改Logback源码 输出IP地址和文件夹路径 超简单!

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

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

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

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

修改Logback源码 输出IP地址和文件夹路径 超简单!

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

修改Logback源码 输出IP地址和文件夹路径 超简单!

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

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

修改Logback源码 输出IP地址和文件夹路径 超简单!

接着进入getEffectiveConverterMap()

修改Logback源码 输出IP地址和文件夹路径 超简单!

发现新大陆修改Logback源码 输出IP地址和文件夹路径 超简单! 注册方法都在getDefaultConverterMap()中

修改Logback源码 输出IP地址和文件夹路径 超简单!

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

这就很简单了,依葫芦画瓢,照着写吧

修改Logback源码 输出IP地址和文件夹路径 超简单!

修改Logback源码 输出IP地址和文件夹路径 超简单!

修改Logback源码 输出IP地址和文件夹路径 超简单!

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

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

修改Logback源码 输出IP地址和文件夹路径 超简单!

最后可以这样

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

讲清楚了在哪里改,修改源码增加自定义变量是不是超简单!