Java日志系統(上)


Java日志系統(上)


最近一段時間,公司的應用架構在向微服務架構轉型,基本框架是Dubbo + zookeeper。在轉型過程種,筆者從網上、書本上,對日志系統有了一些初步了解。找了個時間,這里把學習到的知識做個總結。本文部分內容節選自網上各路大神的博客、《分布式服務架構——原理、設計與實踐》第4章。

1. 概述

日志是程序設計中很重要的一部分,它提供了豐富的程序運行時信息,例如:程序運行時的邏輯信息、錯誤信息、事件描述信息、關鍵數據、狀態信息,以及用戶的登錄信息、操作信息,等等。這些日志信息可以幫助開發人員快速發現和定位問題。在實際生產環境種,日志也是查找問題的重要來源,良好的日志格式和記錄方式可以幫助我們快速找到解決問題的辦法。沒有日志,甚至會失去對系統的可控性。

題外話:一個部署在Tomcat中的應用程序,在Tomcat\logs\文件夾下,有如下幾種常見的日志類型。

  • Tomcat本地日志:通常為localhost.*.txt,該日志是應用程序異常,但是沒有被捕獲時會被一直拋出到容器層,容器處理后記錄在這個日志里。

  • Tomcat存取日志:通常為localhost_access_log.*.txt,該日志是客戶端訪問日志,清晰地記錄了HTTP服務請求的來源、響應時間、返回的HTTP代碼等,可用於統計服務的成功數和失敗數、接口的響應時間、服務的請求數和吞吐量等。

  • Tomcat控制台日志:通常為catalina.*.log或者catalina.out,該日志是引擎的日志文件,包含Tomcat是否成功啟動、啟動所用時間,一級應用程序打印的控制台日志等信息。

  • 應用程序日志:一般使用Commons logging、Log4j、Slf4j、Logback、Log4j2等框架生成應用程序的業務系統日志。后續會詳細介紹。

2. 日志系統的門面模式

在JDK的最初版本中,不包含日志相關的API,直到JDK1.4才出現了JDK Logger。在此期間,開源社區的Apache Commons Logging和Apache Log4j成了應用最廣泛的日志工具,甚至成為Java日志系統的事實上的標准。其中,Apache Commons Logging是通用的日志API,而Apache Log4j則是日志實現。后來,Slf4j和LogBack逐漸取代了Apache Commons Logging和Apache Log4j;Log4j的繼任者Log4j2也迅速流行起來。

由於現在開源的日志系統較多,作為應用開發者,我們希望自己的組件不依賴於某個具體的日志工具,畢竟有很多日志工具可以使用。例如,假如Log4j日志工具存在性能或者其他問題,我們就需要對日志工具進行切換。但是如果我們的應用程序是直接使用的Log4j,在切換時會帶來大量的修改工作。為了解決這個問題,日志系統采用了門面模式

門面模式:提供一個統一的接口去訪問多個子系統的多個不同接口,它為子系統中的一組接口提供一個統一的高層接口。

具體說來,Apache Commons Logging和Slf4j提供通用的日志API,充當門面角色;門面后面才是Log4j、Log4j2和LogBack等具體的實現。有人也將Apache Commons Logging和Slf4j稱為日志框架。

日志框架僅僅提供日志接口,而具體的日志實現則在運行時根據配置,動態地決定具體使用哪個日志系統,也就是說,具體的日志實現交給Log4j這樣的開源日志工具來完成。開發人員只需要針對API進行編程,而運行時可以根據配置切換不同的日志實現。這種方式將我們的應用程序和具體的日志實現進行了解耦,底層日志系統的改變,並不會影響上層的業務代碼,大大提高了靈活性。

3. 開源日志系統

sun公司為了抗衡Log4j,在JDK1.4推出了一套日志系統JDK Logger,它的最大優點是不需要繼承任何類庫,只要有Jre環境,就可以直接使用。但是相比其他開源日志框架,JDK Logger在易用性、功能、擴展性方面都稍遜一籌,被人詬病,所以使用較少。

Java日志系統(下)中,具體介紹常見的開源日志系統。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM