1. Log的用途
通常來講,日誌分爲兩種:業務日誌和異常日誌,使用日子好咱們但願能達到如下目標:html
- 問題追蹤:經過日誌能夠對程序運行狀況進行記錄和監控,便於出現Bug時分析問題
- 狀態監控:經過實時分析日誌,能夠詳細瞭解程序內部的運行狀況
- 日誌對性能的影響儘可能小。
2. Java日誌框架
- Log4j或Log4j2 - Apache的開源項目,經過使用Log4j,咱們能夠控制日誌信息輸送的目的地是控制檯、文件、GUI組件、甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等;用戶也能夠控制每一條日誌的輸出格式;經過定義每一條日誌信息的級別,用戶可以更加細緻地控制日誌的生成過程。這些能夠經過一個配置文件(XML或Properties文件)來靈活地進行配置,而不須要修改程序代碼。Log4j則是前任的一個升級,參考了Logback的許多特性;
- Logback - Logback是由log4j創始人設計的又一個開源日誌組件。logback當前分紅三個模塊:logback-core,logback-classic和logback-access。log-core是其餘兩個模塊的基礎模塊。logback-classic是log4j的一個改良版本。此外logback-classic完整實現SLF4J API,使你能夠很方便地更換成其餘日誌系統如log4j或JDK14 Logging;
- java.util.logging - JDK內置的日誌接口和實現,功能比較簡單。
- SLF4J - SLF4J爲各類Logging API提供一個簡單統一的接口,從而使用戶可以在部署的時候配置本身但願的Logging API實現。
- Apache Commons Logging - Apache Commons Logging (JCL)但願解決的問題和SLF4J相似。
3. Java日誌最佳實踐
定義日誌變量java
日誌變量每每不變,最好定義成final static,變量名用大寫。服務器
日誌分級框架
Java的日誌框架通常會提供如下日誌級別,缺省打開info級別,也就是debug,trace級別的日誌在生產環境不會輸出。在開發和測試環境能夠經過不一樣的日誌配置文件打開debug級別。函數
- fatal - 嚴重的,形成服務中斷的錯誤;
- error - 其餘錯誤運行期錯誤;
- warn - 警告信息,如系統調用了一個即將做廢的接口,接口的不當使用,運行狀態不是指望的但仍可繼續處理等;
- info - 有意義的事件信息,如程序啓動,關閉事件,收到請求事件等;
- debug - 調試信息,可記錄詳細的業務處理到哪一步了,以及當前的變量狀態;
- trace - 更詳細的跟蹤信息;
在程序裏要合理使用日誌分級:性能
4. 基本的Logger編碼規範
1. 在一個對象中一般只使用一個Logger對象,Logger應該是static final的,只有在少數須要在構造函數中傳遞logger的狀況下才使用private final。測試
2. 輸出Exception的所有Throwable信息,由於logger.error(msg)和logger.error(msg,e.getMessage())這樣的日誌輸出方法會丟失掉最重要的StackTrace信息。編碼
3. 不容許記錄日誌後又拋出異常,由於這樣會屢次記錄日誌,只容許記錄一第二天志。spa
4. 不容許出現System println(包括System.out.println和System..println)語句。debug
5. 不容許出現printStackTrace。
6. 日誌性能的考慮,若是代碼爲核心代碼,執行頻率很是高,則輸出日誌建議增長判斷,尤爲是低級別的輸出<debug info warn>。debug日誌太多之後可能會影響性能,有一種改進方法是:
但更好的方法是Slf4j提供的最佳實踐:
一方面能夠減小參數構造的開銷,另外一方面也不用多寫兩行代碼。
7. 有意義的日誌
一般狀況下在程序日誌裏記錄一些比較有意義的狀態數據:程序啓動,退出的時間點;程序運行消耗時間;耗時程序的執行進度;重要變量的狀態變化。除此以外,在公共的日誌裏規避打印程序的調試或者提示信息。