Log日誌的寫法

1. Log的用途

通常來講,日誌分爲兩種:業務日誌和異常日誌,使用日子好咱們但願能達到如下目標:html

  1. 問題追蹤:經過日誌能夠對程序運行狀況進行記錄和監控,便於出現Bug時分析問題
  2. 狀態監控:經過實時分析日誌,能夠詳細瞭解程序內部的運行狀況
  3. 日誌對性能的影響儘可能小。

2. Java日誌框架

  1. Log4j或Log4j2 - Apache的開源項目,經過使用Log4j,咱們能夠控制日誌信息輸送的目的地是控制檯、文件、GUI組件、甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等;用戶也能夠控制每一條日誌的輸出格式;經過定義每一條日誌信息的級別,用戶可以更加細緻地控制日誌的生成過程。這些能夠經過一個配置文件(XML或Properties文件)來靈活地進行配置,而不須要修改程序代碼。Log4j則是前任的一個升級,參考了Logback的許多特性;
  2. Logback - Logback是由log4j創始人設計的又一個開源日誌組件。logback當前分紅三個模塊:logback-core,logback-classic和logback-access。log-core是其餘兩個模塊的基礎模塊。logback-classic是log4j的一個改良版本。此外logback-classic完整實現SLF4J API,使你能夠很方便地更換成其餘日誌系統如log4j或JDK14 Logging;
  3. java.util.logging - JDK內置的日誌接口和實現,功能比較簡單。
  4. SLF4J - SLF4J爲各類Logging API提供一個簡單統一的接口,從而使用戶可以在部署的時候配置本身但願的Logging API實現。
  5. Apache Commons Logging - Apache Commons Logging (JCL)但願解決的問題和SLF4J相似。

3. Java日誌最佳實踐

定義日誌變量java

日誌變量每每不變,最好定義成final static,變量名用大寫服務器

日誌分級框架

Java的日誌框架通常會提供如下日誌級別,缺省打開info級別,也就是debug,trace級別的日誌在生產環境不會輸出。在開發和測試環境能夠經過不一樣的日誌配置文件打開debug級別。函數

  1. fatal - 嚴重的,形成服務中斷的錯誤;
  2. error - 其餘錯誤運行期錯誤;
  3. warn - 警告信息,如系統調用了一個即將做廢的接口,接口的不當使用,運行狀態不是指望的但仍可繼續處理等;
  4. info - 有意義的事件信息,如程序啓動,關閉事件,收到請求事件等
  5. debug - 調試信息,可記錄詳細的業務處理到哪一步了,以及當前的變量狀態; 
  6. 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. 有意義的日誌

一般狀況下在程序日誌裏記錄一些比較有意義的狀態數據:程序啓動,退出的時間點;程序運行消耗時間;耗時程序的執行進度;重要變量的狀態變化。除此以外,在公共的日誌裏規避打印程序的調試或者提示信息。

相關文章
相關標籤/搜索