日志規(guī)約
1. 【強制】應(yīng)用中不可直接使用日志系統(tǒng) (Log 4 j 、 Logback) 中的 API ,而應(yīng)依賴使用日志框架SLF 4 J 中的 API ,使用門面模式的日志框架,有利于維護和各個類的日志處理方式統(tǒng)一。import org.slf4j.Logger;
import org.slf4j.LoggerFactory; private static final Logger logger = LoggerFactory.getLogger(Abc.class);
2. 【強制】日志文件推薦至少保存 15 天,因為有些異常具備以“周”為頻次發(fā)生的特點。
3. 【強制】應(yīng)用中的擴展日志 ( 如打點、臨時監(jiān)控、訪問日志等 ) 命名方式:
appName _ logType _ logName . log 。 logType :日志類型,推薦分類有
stats / desc / monitor / visit 等 ;logName :日志描述。這種命名的好處:通過文件名就可知道日志文件屬于什么應(yīng)用,什么類型,什么目的,也有利于歸類查找。
正例: mppserver 應(yīng)用中單獨監(jiān)控時區(qū)轉(zhuǎn)換異常,如:mppserver _ monitor _ timeZoneConvert . log
說明:推薦對日志進行分類,錯誤日志和業(yè)務(wù)日志盡量分開存放,便于開發(fā)人員查看,也便于通過日志對系統(tǒng)進行及時監(jiān)控。
4. 【強制】對 trace / debug / info 級別的日志輸出,必須使用條件輸出形式或者使用占位符的方式。
說明: logger . debug( " Processing trade with id : " + id + " symbol : " + symbol);
如果日志級別是 warn ,上述日志不會打印,但是會執(zhí)行字符串拼接操作,如果 symbol 是對象,會執(zhí)行 toString() 方法,浪費了系統(tǒng)資源,執(zhí)行了上述操作,最終日志卻沒有打印。
正例: ( 條件 )
if (logger.isDebugEnabled()) { logger.debug("Processing trade with id: " + id + " symbol: " + symbol); }
正例: ( 占位符 )
logger.debug("Processing trade with id: {} symbol : {} ", id, symbol);
5. 【強制】避免重復(fù)打印日志,浪費磁盤空間,務(wù)必在 log 4 j . xml 中設(shè)置 additivity = false 。
正例: <logger name="com.taobao.dubbo.config" additivity="false">
6. 【強制】異常信息應(yīng)該包括兩類信息:案發(fā)現(xiàn)場信息和異常堆棧信息。如果不處理,那么往上拋。
正例: logger.error(各類參數(shù)或者對象 toString + "_" + e.getMessage(), e);
7. 【推薦】可以使用 warn 日志級別來記錄用戶輸入?yún)?shù)錯誤的情況,避免用戶投訴時,無所適從。注意日志輸出的級別, error 級別只記錄系統(tǒng)邏輯出錯、異常等重要的錯誤信息。如非必要,請不要在此場景打出 error 級別。
8. 【推薦】謹慎地記錄日志。生產(chǎn)環(huán)境禁止輸出 debug 日志 ; 有選擇地輸出 info 日志 ; 如果使用 warn 來記錄剛上線時的業(yè)務(wù)行為信息,一定要注意日志輸出量的問題,避免把服務(wù)器磁盤撐爆,并記得及時刪除這些觀察日志。
說明:大量地輸出無效日志,不利于系統(tǒng)性能提升,也不利于快速定位錯誤點。記錄日志時請
思考:這些日志真的有人看嗎?看到這條日志你能做什么?能不能給問題排查帶來好處?