前段時間,公司的一個項目,需要做很多的數據接口和同步程序,于是就遇到了日志記錄的問題,何時記錄,如何記錄,哪些要記哪些不用記等問題。針對日志記錄的問題,經過一系列討論,終于達成了統一的處理辦法。解決了各個模塊系統,不同的開發人員,日志記錄不統一,隨意的問題。今天終于抽出時間把這個問題總結并結合網絡上的資料,進行整理。
為什么要記錄日志
記錄日志是調試程序,監視程序運行的一種重要的方式,主要有兩個目的:bug的及時發現和定位,顯示程序運行狀態。正確詳細的日志記錄能夠快速的定位問題。同樣,通過查看日志,可以看出程序正在做什么,是不是按預期的設計在執行,所以記錄下程序的運行狀態是必要的。
哪些地方需要記日志
1. 調用或封裝外部程序或接口
程序中對外部系統與模塊的依賴調用前后都應該記下日志,方便接口調試。出問題時也可以很快查出是哪里出的問題
LOG.debug("Calling external system:" + parameters);
Object result = null;
try {
result = callRemoteSystem(params);
LOG.debug("Called successfully. result is " + result);
} catch (Exception e) {
LOG.warn("Failed at calling xxx system . exception : " + e);
}
2.對重要對象或變量被修改,要以INFO記錄修改前的信息和修改后的狀態。
程序中重要的狀態信息的變化應該記錄下來,方便查問題時還原現場,推斷程序運行過程
boolean isRunning;
isRunning = true;
LOG.info("System is running");
//...
isRunning = false;
LOG.info("System was interrupted by " + Thread.currentThread().getName());
3.系統入口與出口:
系統的入口和出口,重要方法或模塊的執行。記錄它的輸入與輸出,方便定位。
4.業務異常或者重要的業務處理:
任何業務異常都應該記下來,還有系統中一些重要的業務,比如結算等業務,也最好能記錄下來。
5.非預期執行:
為程序在“有可能”執行到的地方打印日志。如果我想刪除一個文件,結果返回成功。但事實上,那個文件在你想刪除之前就不存在了。最終結果是一致的,但程序得讓我們知道這種情況,要查清為什么文件在刪除之前就已經不存在
int myValue = xxxx;
int absResult = Math.abs(myValue);
if (absResult < 0) {
LOG.info("Original int " + myValue + "has nagetive abs " + absResult);
}
6.很少出現的else情況:
代碼中,一定要有完整的if else,如果else 里面沒有要執行的,記錄日志,這樣避免else吞掉你的請求,或是返回給你難以理解的結果。
Object result = null;
if (running) {
result = xxx;
} else {
result = yyy;
LOG.debug("System does not running, we change the final result");
}
7. 批量數據的執行進度:
LOG.debug("current progress: " + (currentPos * 100 / totalAmount) + "%");
日志記錄的方式
1. 日志信息應該包含記錄程序運行時間和錯誤發生的時間.
2. 日志信息清晰準確有意義
日志應該是清晰準確的: 當看到日志的時,就能準確的知道錯誤是因為連接池取不到連接導致的問題。
Connection connection = ConnectionFactory.getConnection();
if (connection == null) {
LOG.warn("System initialized unsuccessfully");
}
3. 記錄錯誤的位置
代碼中,一定要記錄下錯誤所在的文件名和函數名(必須能區分開重載函數),有行數最好。
4. 區分日志級別
在程序中Log進行分級是很重要的,通常可以分為6 級:TRACE<DEBUG<INFO<WARN<ERROR<FATAL。
DEBUG用來輸出調試信息,一般是在程序中不是非常重要的地方;INFO代表一些比較重要的信息,比如程序初始化完畢,ERROR一般指程序本身引起的,可以恢復的錯誤;FATAL一般指程序所依賴的環境出現錯誤,使的程序不恢復。其中常用的是DEBUG和 ERROR。
5. 信息詳細準確
一定要記錄下完整準確的信息,否則還不如記錄,因為錯誤的信息可能會誤導開發人員。所以最簡單的辦法就是記錄完整的stack trace.
6. 最好能給log帶上上下文
沒有相應的上下文的log,不過是噪音,它們不會對調試過程中有意義的數值或是空間起作用。
Transaction failed 這樣的log信息比沒有記錄更讓人抓狂。
不含病毒。www.avast.com |
留言列表