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加載順序