四、日誌
從事與軟件相關工作的人,應該都聽過“日誌”一詞。這已經成了記錄程序運行、追蹤問題、調試等的最佳途徑。並且,各編程語言都形成了各自的日誌體系和相應的框架(Java是有的,其它開發語言猜測也有,以下以Java日誌討論日誌的問題,其它語言亦可參考)。
在LZ所參與過的項目中,日誌這個功能能提供的信息非常少。主要是開發人員對日誌不重視,一則不瞭解能用來幹什麼或者知道能幹什麼但不知道能做到什麼程度。二則不知道各日誌框架的使用方法和配置方式,三則不知道什麼地方該進行日誌記錄?進行什麼級別的日誌記錄?日誌該寫些什麼東西等。這些現象當然與所處公司或經歷過的學習、培訓等有關。公司對於項目開發沒有一套完整的日誌體系且不夠重視,所以項目中的日誌基本上都是各自發揮的狀態。更有甚者,採用的是“System.out.println()”這種方式進行一些程序記錄或調試,這不單是應屆生有的現象,非應屆生當中也有部分開發人員有此現象。
在詳細討論日誌之前,先來說說爲什麼不採用“System.out.println()”進行記錄或調試的原因:
1.不能知道該打印的發生時間;
2.不能知道該打印的線程信息(名稱、編號);
3.不能知道該打印的具體地址(類名、調用方法名、行號);
4.不能方便的控制該打印的開啓或關閉;
5.不能對該打印進行錄入文件並配置文件的生成方式等。
上面所提到的信息或用法,在程序記錄、追蹤問題、調試等,特別有用,而“System.out.println()”方式只是輸出提供的信息。當然有人會說,我在需要打印的信息中,提供上述信息不就好了!那麼LZ只想反問一句,做這麼多已有的功能,你不嫌累?
對於“System.out.println()”,這種輸出方式,只適用於Java初學者,項目只適用於命令行調用運行的項目。其它情況下則應該堅決拋棄“System.out.println()”這種方式,採用日誌。
在Java日誌中,需要關注的有以下幾方面:
1.日誌的等級:(詳細參考日誌級別Java.util.log.Level)
ERROR:系統發生了嚴重的錯誤,必須馬上進行處理,否則系統將無法繼續運行。
WARN:系統能繼續運行。但是必須引起關注。
INFO:重要的業務邏輯處理完成。
DEBUG:調試信息,主要給開發人員看。
2.日誌的配置:
日誌文件存放位置:統一定點存放,方便查閱。
日誌文件生成規則:以小時/天/周/月爲單位生成日誌文件。
日誌信息的格式:日誌的發生時間、線程名稱、等級、發生位置等信息的格式。
日誌文件的大小限制:爲了在查閱日誌時能快速加載日誌文件,可以對日誌文件大小進行限制。
日誌文件的記錄的日誌類型:根據業務或管理需要,可以將不同的業務的日誌或不同等級的日誌寫入到不同的日誌文件中。
3.何時需要進行日誌記錄:(主要是根據日誌的等級來進行日誌記錄)
系統或業務出錯,業務受阻但不致命;
單個業務的完成,或操作記錄;
請求參數/調用參數,執行/查詢結果等。
總之,日誌的目的是爲了記錄項目的運行情況,主要包括業務記錄、錯誤信息等。在項目出錯時,通過日誌能快速找到出問題的地方和問題產生的原因,則表明該日誌達到了其應有的目的。
4.Java日誌框架:
SLF4J:提供統一的記錄日誌的接口,只要按照其提供的方法記錄即可,最終日誌的格式、記錄級別、輸出方式等通過具體日誌系統(Log4J,Logback,commons-logging等)的配置來實現,可以在應用中靈活切換日誌系統。
Log4J:一款基於Java的開源日誌組件,功能非常強大,可以將日誌信息輸出到控制檯、文件、用戶界面,也可以輸出到操作系統的事件記錄器和一些系統常駐進程。也是最受歡迎的Java日誌組件。
另:說起日誌,不得不提IntellJ IDEA的一個插件Grep Console,這個插件可以將在IntellJ IDEA中運行的應用程序產生的日誌進行查找標記,對於在Java程序開發過程中,查看調試、運行信息非常有幫助。