在Java 領域存在大量的日志組件openopen收錄了個日志組件日志系統作為一種應用程序服務對於跟蹤調試程序狀態記錄崩潰數據恢復都有著重要的作用我們可以把Java日志系統看作是必不可少的跟蹤調試工具
簡介
日志系統是一種不可或缺的跟蹤調試工具特別是在任何無人職守的後台程序以及那些沒有跟蹤調試環境的系統中有著廣泛的應用長期以來日志系統作為一種應用程序服務對於跟蹤調試程序狀態記錄崩潰數據恢復都有非常現實的意義這種服務通常以兩種方式存在
日志系統作為服務進程存在Windows中的的事件日志服務就屬於這種類型該類型的日志系統通常通過消息隊列機制將所需要記錄的日志由日志發送端發送給日志服務日志發送端和日志保存端通常不在同一進程當中日志的發送是異步過程這種日志服務通常用於管理員監控各種系統服務的狀態
日志系統作為系統調用存在Java世界中的日志系統和Unix環境下諸多守護進程所使用的日志系統都屬於這種類型日志系統的代碼作為系統調用被編譯進日志發送端日志系統的運行和業務代碼的運行在同一進程空間日志的發送多數屬於同步過程這種日志服務由於能夠同步反映處系統運行狀態通常用於調試跟蹤和崩潰恢復
本文建立的日志系統基本屬於第二種類型但又有所不同該日志系統將利用Java線程技術實現一個既能夠反映統一線程空間中程序運行狀態的同步日志發送過程又能夠提供快速的日志記錄服務還能夠提供靈活的日志格式配置和過濾機制
系統調試的誤區
在控制台環境上調試Java程序時此時往控制台或者文本文件輸出一段文字是查看程序運行狀態最簡單的做法但這種方式並不能解決全部的問題有時候對於一個我們無法實時查看系統輸出的系統或者一個確實需要保留我們輸出信息的系統良好的日志系統顯得相當必要因此不能隨意的輸出各種不規范的調試信息這些隨意輸出的信息是不可控的難以清除可能為後台監控錯誤排除和錯誤恢復帶來相當大的阻力
日志系統框架的基本功能
一個完備的日志系統框架通常應當包括如下基本特性
所輸出的日志擁有自己的分類這樣在調試時便於針對不同系統的不同模塊進行查詢從而快速定位到發生日志事件的代碼
日志按照某種標准分成不同級別分級以後的日志可以用於同一分類下的日志篩選
支持多線程日志系統通常會在多線程環境中使用特別是在Java系統當中因此作為一種系統資源日志系統應當保證是線程安全的
支持不同的記錄媒介不同的工程項目往往對日志系統的記錄媒介要求不同因此日志系統必須提供必要的開發接口以保證能夠比較容易的更換記錄介質
高性能日志系統通常要提供高速的日志記錄功能以應對大系統下大請求流量下系統的正常運轉
穩定性日志系統必須是保持高度的穩定性不能因為日志系統內部錯誤導致主要業務代碼的崩潰
常用日志系統簡介
在Java世界中以下三種日志框架比較優秀
)LogJ
最早的Java日志框架之一由Apache基金會發起提供靈活而強大的日志記錄機制但是其復雜的配置過程和內部概念往往令使用者望而卻步
)JDKLoggingFramework
繼LogJ之後JDK標准委員會將LogJ的基本思想吸收到JDK當中在JDK中發布了第一個日志框架接口並提供了一個簡單實現
)CommonsLoggingFramwork
該框架同樣是Apache基金會項目其出現主要是為了使得Java項目能夠在LogJ和JDKlLoggingFramework的使用上隨意進行切換因此該框架提供了統一的調用接口和配置方法
系統設計
由於LogJ得到廣泛應用從使用者的角度考慮本文所設計的框架采用了部分LogJ的接口和概念但內部實現則完全不同使用Java實現日志框架關鍵的技術在於前面提及的日志框架特性的內部實現特別是日志的分類和級別日志分發框架的設計日志記錄器的設計以及在設計中的高性能和高穩定性的考慮
系統架構
日志系統框架可以分為日志記錄模塊和日志輸出模塊兩大部分日志記錄模塊負責創建和管理日志記錄器(Logger)每一個Logger對象負責按照不同的級別(LoggerLevel)接收各種記錄了日志信息的日志對象(LogItem)Logger對象首先獲取所有需要記錄的日志並且同步地將日志分派給日志輸出模塊日志輸出模塊則負責日志輸出器(Appender)的創建和管理以及日志的輸出系統中允許有多個不同的日志輸出器日志輸出器負責將日志記錄到存儲介質當中系統結構如下圖所示
Java核心技術免費提供,內容來源於互聯網,本文歸原作者所有。