使用日志facade slf4j
在代碼中不直接使用具體日志LIB庫API巨坊,例如log4j,logback等躁锁,使用日志facade 庫slf4j减俏。使用facade的好處是,與日志實(shí)現(xiàn)解耦贸街,可以方便切換日志實(shí)現(xiàn)。
log4j日志性能
log4j rootLogger對象鎖由于比較粗的控制粒度狸相,導(dǎo)致高并發(fā)日志輸出頻繁的時(shí)候薛匪,性能下降很厲害。log4j2在性能上有了很大的提升脓鹃。推薦使用log4j2 的異步appender逸尖。
日志級別
log4j2 日志級別有OFF,F(xiàn)ATAL,ERROR娇跟,WARN岩齿,INFO,DEBUG苞俘,ALL盹沈。建議只使用 DEBUG、INFO吃谣、WARN乞封、ERROR這四個(gè)級別,這些日志級別也是slf4j使用的級別岗憋。
典型的級別有:
- DEBUG——最詳細(xì)肃晚,但是只有在開發(fā)或者調(diào)試時(shí)適用
- INFO——最常用的級別
- WARN——發(fā)生不在預(yù)期之內(nèi)的一些狀態(tài),但是可接受
- ERROR——有錯(cuò)誤發(fā)生
在不同環(huán)境會(huì)采用不同的日志級別仔戈。一般关串,相比較第三方庫里輸出的日志,我們更關(guān)注自己應(yīng)用程序的日志記錄杂穷。
- 開發(fā)/測試環(huán)境:應(yīng)用 DEBUG 第三方庫 WARN
- 生產(chǎn)環(huán)境:應(yīng)用 INFO 第三方庫 WARN
log4j2配置monitorInterval悍缠,在運(yùn)行時(shí)修改配置,可以直接生效日志配置耐量。在生產(chǎn)環(huán)境飞蚓,偶爾在需要的時(shí)候,會(huì)開啟debug級別廊蜒,獲取更多的日志信息來分析問題趴拧。
使用slf4j parameterized logging
當(dāng)日志語句禁用的情況下, 使用parameterized logging 參數(shù)化日志山叮, 可以提升性能著榴。
例如:
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
不管debug級別日志是否啟用,日志文本都會(huì)進(jìn)行類型轉(zhuǎn)化和文本拼接的操作屁倔。
通常我們可以通過增加判斷脑又,來避免不必要的文本拼接操作。
if(logger.isDebugEnabled()) {
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
}
使用這種方法锐借,不論是否debug 開啟问麸,增加 了 檢查 日志是否啟用的判斷一次是 isDebugEnabled 一次是debug方法里面。
slf4j提供了 parameterized logging機(jī)制钞翔,只有要必要的情況下严卖,才會(huì)對日志本本進(jìn)行組裝。
logger.debug("Entry number: {} is {}", i, entry[i]);
記錄布轿,切記過多過少
日志信息哮笆,可以幫助定位問題来颤,也可以利用日志信息,分析用戶行為稠肘,用于統(tǒng)計(jì)信息福铅。
日志過多,會(huì)占用太大的磁盤空間启具,難以維護(hù)本讥。
比起日志過少,日志過多倒并不是什么大問題鲁冯。一般拷沸,日志都是會(huì)手機(jī)到日志服務(wù)器去做集中式存儲(chǔ),便于后期分析和統(tǒng)計(jì)需要薯演。
日志過少時(shí)撞芍,因?yàn)槿鄙傩畔ⅲ治鯾ug和故障的時(shí)候就捉襟見肘了跨扮。
盡量在日志中序无,包含足夠的信息。例如 操作的數(shù)據(jù)衡创、業(yè)務(wù)數(shù)據(jù)等信息帝嗡,便于快速的診斷問題。
記錄性能信息
記錄執(zhí)行時(shí)間可以用來幫助定位性能問題璃氢。一般只需要記錄那些可能比較耗時(shí)的地方:
- 慢服務(wù)調(diào)用
- 慢servie層方法
- 慢執(zhí)行SQL語句