(Notice:以下所有經(jīng)驗(yàn)也是我根據(jù)網(wǎng)上的經(jīng)驗(yàn)整理的瑰艘,如有侵權(quán)可以聯(lián)系我刪除,歡迎交流和溝通肤舞,Wx:IT_Ezra紫新,QQ 654303408。 有問(wèn)題討論也可聯(lián)系我李剖。)
(PS:Log(日志)對(duì)于程序員來(lái)說(shuō)芒率,是一個(gè)非常非常重要的工具,無(wú)論是對(duì)于開(kāi)發(fā)杖爽,對(duì)于運(yùn)維敲董,對(duì)于測(cè)試來(lái)說(shuō)紫皇,都是非常重要的信息慰安,下面我們來(lái)介紹一下日志。)
在我剛開(kāi)始學(xué)習(xí)編程的時(shí)候聪铺,我的導(dǎo)生告訴我化焕,作為程序員,必須要會(huì)單步調(diào)試铃剔,會(huì)打斷電撒桨,會(huì)看控制臺(tái)。其實(shí)這種說(shuō)法轉(zhuǎn)換到現(xiàn)在來(lái)說(shuō)就是:會(huì)打log键兜,會(huì)看日志文檔凤类。
對(duì)于現(xiàn)在成熟的框架項(xiàng)目,日志已經(jīng)成為了基本普气,作為運(yùn)營(yíng)谜疤,第一基本功就是要會(huì)看日志文檔,而作為變成的時(shí)候现诀,我們經(jīng)常會(huì)在代碼中打log夷磕,來(lái)進(jìn)行過(guò)程判斷,然后再根據(jù)日志文檔進(jìn)行排查bug和解決bug仔沿。常見(jiàn)的封裝好的logger包目前有l(wèi)og4j坐桩,slf4j,而slf4j實(shí)際上是根據(jù)某些功能對(duì)log4j進(jìn)行了一定的封裝封锉。
對(duì)于日志绵跷,我們首先要了解一個(gè)概念就是膘螟,日志級(jí)別,日志是分級(jí)別的碾局,從低到高分別是萍鲸。logger.debug,logger.info,logger.warn,logger.error,logger.fatal。其中低級(jí)別的會(huì)輸出高級(jí)別的信息擦俐,高級(jí)別的不會(huì)輸出低級(jí)別的脊阴,什么意思呢?就是在配置日志的時(shí)候蚯瞧,會(huì)有一個(gè)配置文件嘿期,來(lái)選擇我對(duì)這個(gè)系統(tǒng)的日志級(jí)別進(jìn)行選擇,如果我選擇debug級(jí)別的埋合。那么备徐,fatal,error,warn,info,debug。這些日志都會(huì)被展示出來(lái)甚颂。而如果我選擇fatal級(jí)別的蜜猾。那么日志文件里面只會(huì)有fatal的日志。你對(duì)于logger.error等等都不會(huì)輸出振诬。
這樣會(huì)導(dǎo)致什么問(wèn)題呢蹭睡?
如果錯(cuò)誤的選擇日志級(jí)別,可能會(huì)導(dǎo)致吞異常8厦础<缁怼!這個(gè)就很嚴(yán)重了辫呻,你的程序出現(xiàn)了異常清钥,但是你卻通過(guò)日志文檔看不到異常在哪里。因?yàn)槟氵x擇了高級(jí)別的日志級(jí)別放闺。所以祟昭,低等級(jí)的日志就被吞掉了。但是講道理來(lái)說(shuō)怖侦,一般不會(huì)出現(xiàn)這種情況篡悟。因?yàn)槲覀兊娜罩炯?jí)別通常會(huì)選擇info,或者error础钠,而我們的異常一般會(huì)通過(guò)error來(lái)輸出恰力。所以,針對(duì)不同的情況旗吁,選擇不同的日志輸出方式也很簡(jiǎn)單踩萎。
哪些輸出方式呢?很钓?
上文也介紹了香府。有五種董栽,我們通常使用的,debug企孩,info锭碳,error。在調(diào)試狀態(tài)下的時(shí)候使用debug勿璃,(但是這個(gè)也不是硬性規(guī)定)擒抛,如果想輸出某一個(gè)內(nèi)容來(lái)進(jìn)行判斷,我們通常用到info补疑,也就是information的簡(jiǎn)寫(xiě)歧沪。然后就是error,通常用error來(lái)輸出異常莲组。
log4j和slf4j有一個(gè)很大的區(qū)別就是:方法的用法诊胞。
什么意思呢?log4j的日志方法通常類似這樣:
logger.info("-------------------用戶昵稱" + senseAgroMember.getMemberNickname() + "--------------");
slf4j的日志方法通常是這樣
logger.info("-------------------用戶昵稱={}" 锹杈,senseAgroMember.getMemberNickname() + "--------------");
有什么區(qū)別撵孤,如果用“,”竭望,是使用{}占位符邪码。避免字符串連接操作,減少String對(duì)象(不可變)帶來(lái)的內(nèi)存開(kāi)銷市框。我們知道String在java里面是 final static的霞扬。所以用“+”糕韧,會(huì)重新開(kāi)辟空間枫振,然后生成新的String對(duì)象,浪費(fèi)空間萤彩。
日志的分類
這里就是一個(gè)很重要的知識(shí)點(diǎn)粪滤。就是分開(kāi)打印。為什么需要分開(kāi)打印雀扶。作為程序員杖小,要學(xué)會(huì)用計(jì)算機(jī)的思維去思考問(wèn)題。計(jì)算機(jī)的特點(diǎn)是高效愚墓,笨予权。什么意思,就是當(dāng)我們選擇使用日志的時(shí)候浪册,如果不做任何配置扫腺,那么,所有的日志都會(huì)導(dǎo)入一個(gè)日志文件村象,然后這個(gè)日志文件的內(nèi)存就會(huì)一直變大笆环,里面的內(nèi)容雜亂無(wú)章攒至。只要是日志就往里面放。對(duì)于這樣的日志躁劣,沒(méi)有任何意義迫吐。頂多只能在運(yùn)行的時(shí)候觀察一下,但是如果需要通過(guò)日志文件來(lái)進(jìn)行二次使用账忘,是根本不可能的志膀。那么我們需要對(duì)日志進(jìn)行分類。這里的分類分兩種鳖擒,這兩種是并行的:
-
一種是按時(shí)間切分梧却。(修改tomcat的catalina.sh文件,具體操作可以去網(wǎng)上查詢)败去。我們可以按天分類放航,并且將日志文件的名字也按天命名,這樣查詢的時(shí)候就會(huì)非常方便圆裕。
-
同時(shí)我們還要按需求分類广鳍,什么意思,比如說(shuō)吓妆,我的異常都打印到一個(gè)日志赊时,我有不同的模塊,我的每一個(gè)模塊的日志劃分到某一個(gè)模塊日志文件行拢,比如我的登錄日志祖秒,就放到登錄日志文件里面,查詢?nèi)罩揪头诺讲樵內(nèi)罩纠锩嬷鄣欤踔吝€能細(xì)化到竭缝,訂單查詢,用戶查詢分到不同的日志文件里面沼瘫。
我這次分享的內(nèi)容就是這些抬纸,希望每個(gè)人都能好好的使用日志。讓我們的代碼更加僅僅有條耿戚。bug更少湿故,效率更高。謝謝膜蛔!