將 tomcat 日志記錄成 json

本文 Tomcat 版本為 8.0.36翎蹈。

首先要搞清楚一點走趋,開發(fā)打的業(yè)務(wù)日志要么讓開發(fā)打成 json 格式稽煤,要么使用 Logstash 進(jìn)行解析,不可能有通用的產(chǎn)品可以完成妖谴,因為每個公司開發(fā)打印的日志的標(biāo)準(zhǔn)都不一樣窿锉。這里改變的只是 tomcat 本身的日志格式。

tomcat 自身的日志有:

catalina.2018-01-05.log
host-manager.2018-01-05.log
localhost.2018-01-05.log
manager.2018-01-05.log
localhost_access_log.2018-01-05.log

catalina.out 包括 tomcat 本身和開發(fā)打印的應(yīng)用日志膝舅,不做討論嗡载。

Tomcat 日志的訪問日志是在 server.xml 中配置的,配置成 json 格式也十分方便仍稀,而對于其他日志想要配置成 json 格式就十分不便了鼻疮。對于這些日志,tomcat 提供了兩種記錄的方式琳轿,一種是默認(rèn)的 java.util.logging判沟,另一種就是 log4j。默認(rèn)的方式無法記錄成 json(至少我沒找到方式)崭篡,而通過 log4j 可以挪哄,因為 Logstash 提供了一個插件。

首先我們要做的就是將 tomcat 日志的記錄的方式改為 log4j琉闪,修改的方式在此迹炼。這是官方文檔的翻譯,你也可以直接看官方文檔颠毙。

需要注意的是:

  • log4j 的 jar 包一定要是 1.2.X 版本的斯入,不要下載最新版;
  • 示例的 log4j.properties 中指定的日志文件是 catalina蛀蜜,而非 catalina.out刻两。

所有 jar 包都可以在 https://mvnrepository.com/ 這里下載。

如果沒有改變官方給出的 log4j.properties 的日志記錄格式滴某,那么配置成功后磅摹,tomcat/logs/catalina 的輸出和之前的 catalina.out 一樣。下一步就是使用 Logstash 提供的插件霎奢,這個怎么用呢户誓?很簡單,首先去上面給出的 maven 倉庫中下載 jar 包(最好使用 1.6 版)幕侠,然后放入 tomcat/lib 目錄下帝美,接著修改 log4j.properties:

log4j.rootCategory=WARN, RollingLog
log4j.appender.RollingLog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingLog.Threshold=TRACE
log4j.appender.RollingLog.File=api.log
log4j.appender.RollingLog.DatePattern=.yyyy-MM-dd
log4j.appender.RollingLog.layout=net.logstash.log4j.JSONEventLayoutV1

為了可以直接效果,可以將日志級別改為 INFO晤硕。這個時候如果直接使用的話悼潭,會有下面的報錯:

Using CATALINA_BASE:   /tmp/tomcat
Using CATALINA_HOME:   /tmp/tomcat
Using CATALINA_TMPDIR: /tmp/tomcat/temp
Using JRE_HOME:        /usr/local/jdk1.7.0_79
Using CLASSPATH:       /tmp/tomcat/bin/bootstrap.jar:/tmp/tomcat/bin/tomcat-juli.jar
log4j:WARN Error during default initialization
java.lang.NoClassDefFoundError: org/apache/commons/lang/time/FastDateFormat
    at net.logstash.log4j.JSONEventLayoutV0.<clinit>(JSONEventLayoutV0.java:36)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at java.lang.Class.newInstance(Class.java:379)
    at org.apache.log4j.helpers.OptionConverter.instantiateByClassName(OptionConverter.java:336)
    at org.apache.log4j.helpers.OptionConverter.instantiateByKey(OptionConverter.java:123)
    at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:764)
    at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:735)
    at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:615)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:502)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:547)
    at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:483)
    at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
    at org.apache.log4j.Logger.getLogger(Logger.java:104)
    at org.apache.juli.logging.impl.Log4JLogger.getLogger(Log4JLogger.java:262)
    at org.apache.juli.logging.impl.Log4JLogger.<init>(Log4JLogger.java:108)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at org.apache.juli.logging.impl.LogFactoryImpl.createLogFromClass(LogFactoryImpl.java:1025)
    at org.apache.juli.logging.impl.LogFactoryImpl.discoverLogImplementation(LogFactoryImpl.java:844)
    at org.apache.juli.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:541)
    at org.apache.juli.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:292)
    at org.apache.juli.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:269)
    at org.apache.juli.logging.LogFactory.getLog(LogFactory.java:657)
    at org.apache.catalina.startup.Catalina.<clinit>(Catalina.java:820)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at java.lang.Class.newInstance(Class.java:379)
    at org.apache.catalina.startup.Bootstrap.init(Bootstrap.java:268)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:455)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang.time.FastDateFormat
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 36 more

需要下載以下包,放入 tomcat/lib 目錄下:

commons-lang-2.4
json-smart-1.1.1
junit-4.8.1

然后就可以在 api.log 中看到效果了:

{"@fields":{"level":"INFO","threadName":"localhost-startStop-1","mdc":{},"file":"HostConfig.java","class":"org.apache.catalina.startup.HostConfig","line_number":"1143","method":"deployDirectory","loggerName":"org.apache.catalina.startup.HostConfig"},"@timestamp":"2018-01-05T01:36:38.263Z","@message":"Deployment of web application directory \/tmp\/tomcat\/webapps\/manager has finished in 64 ms","@source_host":"SUC-IAS-JOB-02.UAT"}
{"@fields":{"level":"INFO","threadName":"main","mdc":{},"file":"AbstractProtocol.java","class":"org.apache.coyote.AbstractProtocol","line_number":"471","method":"start","loggerName":"org.apache.coyote.http11.Http11NioProtocol"},"@timestamp":"2018-01-05T01:36:38.265Z","@message":"Starting ProtocolHandler [\"http-nio-9021\"]","@source_host":"SUC-IAS-JOB-02.UAT"}
{"@fields":{"level":"INFO","threadName":"main","mdc":{},"file":"AbstractProtocol.java","class":"org.apache.coyote.AbstractProtocol","line_number":"471","method":"start","loggerName":"org.apache.coyote.ajp.AjpNioProtocol"},"@timestamp":"2018-01-05T01:36:38.270Z","@message":"Starting ProtocolHandler [\"ajp-nio-8009\"]","@source_host":"SUC-IAS-JOB-02.UAT"}
{"@fields":{"level":"INFO","threadName":"main","mdc":{},"file":"Catalina.java","class":"org.apache.catalina.startup.Catalina","line_number":"642","method":"start","loggerName":"org.apache.catalina.startup.Catalina"},"@timestamp":"2018-01-05T01:36:38.272Z","@message":"Server startup in 695 ms","@source_host":"SUC-IAS-JOB-02.UAT"}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窗骑,一起剝皮案震驚了整個濱河市女责,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌创译,老刑警劉巖抵知,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異软族,居然都是意外死亡刷喜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門立砸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掖疮,“玉大人,你說我怎么就攤上這事颗祝∽巧粒” “怎么了恼布?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長搁宾。 經(jīng)常有香客問我折汞,道長,這世上最難降的妖魔是什么盖腿? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任爽待,我火速辦了婚禮,結(jié)果婚禮上翩腐,老公的妹妹穿的比我還像新娘鸟款。我一直安慰自己,他們只是感情好茂卦,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布何什。 她就那樣靜靜地躺著,像睡著了一般疙筹。 火紅的嫁衣襯著肌膚如雪富俄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天而咆,我揣著相機與錄音霍比,去河邊找鬼。 笑死暴备,一個胖子當(dāng)著我的面吹牛悠瞬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涯捻,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼浅妆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了障癌?” 一聲冷哼從身側(cè)響起凌外,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涛浙,沒想到半個月后康辑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡轿亮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年疮薇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片我注。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡按咒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出但骨,到底是詐尸還是另有隱情励七,我是刑警寧澤智袭,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站呀伙,受9級特大地震影響补履,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剿另,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贬蛙。 院中可真熱鬧雨女,春花似錦、人聲如沸阳准。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽野蝇。三九已至讼稚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绕沈,已是汗流浹背锐想。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乍狐,地道東北人赠摇。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像浅蚪,于是被迫代替她去往敵國和親藕帜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 概述 監(jiān)控預(yù)警平臺, eagle + eye (鷹眼)的合體詞, 寓意可以快速發(fā)現(xiàn)問題, 并及時作出響應(yīng),Eagl...
    Kungfu貓熊閱讀 7,387評論 0 52
  • 轉(zhuǎn)自陳明乾的博客惜傲,可能有一定更新洽故。 轉(zhuǎn)原文聲明: 原創(chuàng)作品,允許轉(zhuǎn)載盗誊,轉(zhuǎn)載時請務(wù)必以超鏈接形式標(biāo)明文章 原始出處 ...
    LUNJINGJIE閱讀 3,974評論 1 33
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理时甚,服務(wù)發(fā)現(xiàn),斷路器浊伙,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 在應(yīng)用程序中添加日志記錄總的來說基于三個目的:監(jiān)視代碼中變量的變化情況撞秋,周期性的記錄到文件中供其他應(yīng)用進(jìn)行統(tǒng)計分析...
    時待吾閱讀 5,042評論 1 13
  • 為何喜歡岳綺羅? 一身紅袍,印象猶為深刻嚣鄙。與張顯宗的情感糾葛讓我更加喜歡她吻贿。 雖然她吸人精氣,是個反派哑子。但她又值得...
    夏月無邊閱讀 225評論 0 0