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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM