Logger日志
日志主要是記錄系統中相關問題及事件信息,可以通過這些信息排查錯誤的發生原因,一些事件的追蹤,業務邏輯統計分析。好的日志可以省去開發者一大半的時間。
在個人那么多天的研究中,從開始對Logger一無所知,或者說有愚蠢的想法(不就簡單的打印日志而已),到現在發現Logger體系如此美妙絕倫。
Logger日志常用框架
常用的實現框架:
- Log4j:Apache的開源項目,是一個功能強大的日志組件,提供方便的日志記錄。

<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.29</version> </dependency>
- Logback:Logback是由log4j創始人設計的又一個開源日志組件。logback當前分成三個模塊:logback-core,logback- classic和logback-access

<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> </dependency>
- Log4j2:是log4j 1.x 的升級版,參考了Logback的一些優秀的設計,並且修復了一些問題,采取異步日志模式,解決了因日志造成的性能問題,帶來了一些重大的提升。(值得推薦)

<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>${log4j2.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${log4j2.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>${log4j2.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jcl</artifactId> <version>${log4j2.version}</version> </dependency>
- Common-logging:是apache提供的一個通用的日志接口。用戶可以通過配置自由選擇第三方的日志組件作為具體實現。

<dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency>
- Slf4j:類似於Apache Common-Logging,j是一個門面適配器,所有的日志代碼都可以用slf4j方式,它會根據項目具體依賴的日志實現包進行日志操作,只需修改pom.xml文件中的日志實現依賴(已做好橋接包)

<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.21</version>
還有好多其他的框架不再一一介紹,使用什么框架主要還是看項目和人所適合的方向。
常用日志框架的性能比較--參考連接
Logger日志等級描述
對於標准級別它們關系如下:ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
之后我會對等級的動態調整做相應的文章進一步介紹
日志規約——參考阿里嵩山版
- 應用中不可直接使用日志系統(Log4j、Logback)中的 API,而應依賴使用日志框架中的 API,使用門面模式的日志框架,有利於維護和各個類的日志處理方式統一。
- 在日志輸出時,字符串變量之間的拼接使用占位符的方式。
logger.debug("Processing trade with id: {} and symbol: {}", id, symbol);
- 避免重復打印日志,浪費磁盤空間,務必在日志配置文件中設置 additivity=false。
<logger name="com.taobao.dubbo.config" additivity="false">
-
生產環境禁止直接使用 System.out 或 System.err 輸出日志或使用,標准日志輸出與標准錯誤輸出文件每次 Jboss 重啟時才滾動,如果大量輸出送往這兩個文件,容易造成文件大小超過操作系統大小限制。
-
日志打印時禁止直接用 JSON 工具將對象轉換成 String。如果對象里某些 get 方法被覆寫,存在拋出異常的情況,則可能會因為打印日志而影響正常業務流程的執行。
-
謹慎地記錄日志。生產環境禁止輸出 debug 日志;有選擇地輸出 info 日志;如果使用warn 來記錄剛上線時的業務行為信息,一定要注意日志輸出量的問題,避免把服務器磁盤撐爆,並記得及時刪除這些觀察日志。