log4j日志框架的設(shè)計和實現(xiàn)_第1頁
log4j日志框架的設(shè)計和實現(xiàn)_第2頁
log4j日志框架的設(shè)計和實現(xiàn)_第3頁
log4j日志框架的設(shè)計和實現(xiàn)_第4頁
log4j日志框架的設(shè)計和實現(xiàn)_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、1           簡介日志系統(tǒng)是一種不可或缺的跟蹤調(diào)試工具,特別是在任何無人職守的后臺程序以及那些沒有跟蹤調(diào)試環(huán)境的系統(tǒng)中有著廣泛的應(yīng)用。 長期以來, 日志系統(tǒng)作為一種應(yīng)用程序服務(wù),對于跟蹤調(diào)試、程序狀態(tài)記錄、崩潰數(shù)據(jù)恢復(fù)都有非?,F(xiàn)實的意義。這種服務(wù)通常以兩種方式存在:1.        日志系統(tǒng)作為服務(wù)進(jìn)程存在。 Windows 中的的事件日志服務(wù)就屬于這種類型,該類型的日志系統(tǒng)

2、通常通過消息隊列機(jī)制將所需要記錄的日志由日志發(fā)送端發(fā)送給日志服務(wù)。日志發(fā)送端和日志保存端通常不在同一進(jìn)程當(dāng)中,日志的發(fā)送是異步過程。這種日志服務(wù)通常用于管理員監(jiān)控各種系統(tǒng)服務(wù)的狀態(tài)。2.        日志系統(tǒng)作為系統(tǒng)調(diào)用存在。 Java 世界中的日志系統(tǒng)和 Unix 環(huán)境下諸多守護(hù)進(jìn)程所使用的日志系統(tǒng)都屬于這種類型。日志系統(tǒng)的代碼作為系統(tǒng)調(diào)用被編譯進(jìn)日志發(fā)送端,日志系統(tǒng)的運行和業(yè)務(wù)代碼的運行在同一進(jìn)程空間。日志的發(fā)送多數(shù)屬于同步過程。這種日志服務(wù)由于能夠同步反映處系統(tǒng)運行狀

3、態(tài),通常用于調(diào)試跟蹤和崩潰恢復(fù)。本文建立的日志系統(tǒng)基本屬于第二種類型,但又有所不同。該日志系統(tǒng)將利用 Java 線程技術(shù)實現(xiàn)一個既能夠反映統(tǒng)一線程空間中程序運行狀態(tài)的同步日志發(fā)送過程,又能夠提供快速的日志記錄服務(wù),還能夠提供靈活的日志格式配置和過濾機(jī)制。1.1          系統(tǒng)調(diào)試的誤區(qū)在控制臺環(huán)境上調(diào)試 Java 程序時,此時往控制臺或者文本文件輸出一段文字是查看程序運行狀態(tài)最簡單的做法,但這種方式并不能解決全部的問題。有時候,對于一個我們無法實時查看系統(tǒng)輸出的系統(tǒng)或者一個確實需要保留我

4、們輸出信息的系統(tǒng),良好的日志系統(tǒng)顯得相當(dāng)必要。因此,不能隨意的輸出各種不規(guī)范的調(diào)試信息,這些隨意輸出的信息是不可控的,難以清除,可能為后臺監(jiān)控、錯誤排除和錯誤恢復(fù)帶來相當(dāng)大的阻力。1.2          日志系統(tǒng)框架的基本功能一個完備的日志系統(tǒng)框架通常應(yīng)當(dāng)包括如下基本特性:1.   所輸出的日志擁有自己的分類。這樣在調(diào)試時便于針對不同系統(tǒng)的不同模塊進(jìn)行查詢,從而快速定位到發(fā)生日志事件的代碼。2.   日志按照某種標(biāo)準(zhǔn)分成不同級別。分級以后的日志,可以用于

5、同一分類下的日志篩選。3.   支持多線程。日志系統(tǒng)通常會在多線程環(huán)境中使用,特別是在 Java 系統(tǒng)當(dāng)中,因此作為一種系統(tǒng)資源,日志系統(tǒng)應(yīng)當(dāng)保證是線程安全的。4.   支持不同的記錄媒介。不同的工程項目往往對日志系統(tǒng)的記錄媒介要求不同,因此日志系統(tǒng)必須提供必要的開發(fā)接口,以保證能夠比較容易的更換記錄介質(zhì)。5.   高性能。日志系統(tǒng)通常要提供高速的日志記錄功能以應(yīng)對大系統(tǒng)下大請求流量下系統(tǒng)的正常運轉(zhuǎn)。6.   穩(wěn)定性。日志系統(tǒng)必須是保持高度的穩(wěn)定性,不能因為日志系統(tǒng)內(nèi)部錯誤導(dǎo)致主要業(yè)務(wù)代碼的崩潰

6、。1.3          常用日志系統(tǒng)簡介在 Java 世界中,以下三種日志框架比較優(yōu)秀:1)         Log4J最早的 Java 日志框架之一,由 Apache 基金會發(fā)起,提供靈活而強(qiáng)大的日志記錄機(jī)制。但是其復(fù)雜的配置過程和內(nèi)部概念往往令使用者望而卻步。2)         JDK1.4 Logging

7、Framework繼 Log4J 之后, JDK 標(biāo)準(zhǔn)委員會將 Log4J 的基本思想吸收到 JDK 當(dāng)中,在 JDK1.4 中發(fā)布了第一個日志框架接口,并提供了一個簡單實現(xiàn)。3)         Commons Logging Framwork該框架同樣是 Apache 基金會項目,其出現(xiàn)主要是為了使得 Java 項目能夠在 Log4J 和 JDK1.4 l Logging Framework 的使用上隨意進(jìn)行切換,因此該框架提供了統(tǒng)一的調(diào)用接口和配置方法。2   

8、0;       系統(tǒng)設(shè)計由 于 Log4J 得到廣泛應(yīng)用,從使用者的角度考慮,本文所設(shè)計的框架,采用了部分 Log4J 的接口和概念,但內(nèi)部實現(xiàn)則完全不同。使用 Java 實現(xiàn)日志框架,關(guān)鍵的技術(shù)在于前面提及的日志框架特性的內(nèi)部實現(xiàn),特別是:日志的分類和級別、日志分發(fā)框架的設(shè)計、日志記錄器的設(shè)計以及在設(shè)計中的高性能 和高穩(wěn)定性的考慮。2.1          系統(tǒng)架構(gòu)日 志系統(tǒng)框架可以分為日志記錄模塊和日志輸出模塊兩大部分。

9、日志記錄模塊負(fù)責(zé)創(chuàng)建和管理日志記錄器 (Logger) ,每一個 Logger 對象負(fù)責(zé)按照不同的級別 (LoggerLevel) 接收各種記錄了日志信息的日志對象 (LogItem) , Logger 對象首先獲取所有需要記錄的日志,并且同步地將日志分派給日志輸出模塊。日志輸出模塊則負(fù)責(zé)日志 輸出器 (Appender) 的創(chuàng)建和管理,以及日志的輸出。系統(tǒng)中允許有多個不同的日志 輸出器 ,日志 輸出器 負(fù)責(zé)將日志記錄到存儲介質(zhì)當(dāng)中。系統(tǒng)結(jié)構(gòu)如下圖 1 所示:  圖 1 ,日志系統(tǒng)結(jié)構(gòu)圖下圖 2 使用 UML 類圖給出了日志系統(tǒng)的架構(gòu):  圖 2 ,日志

10、系統(tǒng)框架架構(gòu)圖       在圖 2 給出的架構(gòu)中, 日志記錄器 Logger 是整個日志系統(tǒng)框架的用戶使用接口,程序員可以通過該接口記錄日志,為了實現(xiàn)對日志進(jìn)行分類,系統(tǒng)設(shè)計允許存在多個 Logger 對象,每一個 Logger 負(fù)責(zé)一類日志的記錄, Logger 類同時實現(xiàn)了對其對象本身的管理。 LoggerLevel 類定義了整個日志系統(tǒng)的級別,在客戶端創(chuàng)建和發(fā)送日志時,這些級別會被使用到。 Logger 對象在接收到客戶端創(chuàng)建和發(fā)送的日志消息時,同時將該日志消息包裝成日志系統(tǒng)內(nèi)部所使用的日志對象 LogItem ,日志對象除了

11、發(fā)送端所發(fā)送的消息以外,還會包裝諸如發(fā)送端類名、發(fā)送事件、發(fā)送方法名、發(fā)送行號等等。這些額外的消息對于系統(tǒng)的跟蹤和調(diào)試都非常有價 值。包裝好的 LogItem 最終被發(fā)送給 輸出器 ,由這些 輸出 器負(fù)責(zé)將日志信息寫入最終媒介, 輸出器 的類型和個數(shù)均不固定,所有的 輸出器 通過 AppenderManager 進(jìn)行管理,通常通過配置文件即可方便擴(kuò)展出多個 輸出器 。2.2          日志記錄部分的設(shè)計如前文所述,日志記錄部分負(fù)責(zé)接收日志系統(tǒng)客戶端發(fā)送來的日志消息、日志對象的管理等工作。

12、下面詳細(xì)描述了日志記錄部分的設(shè)計要點:1.          日志記錄器的管理系統(tǒng)通過保持多個 Logger 對象的方式來進(jìn)行日志記錄的分類。每一個 Logger 對象代表一類日志分類。因此, Logger 對象的名稱屬性是其唯一標(biāo)識,通過名稱屬性獲取一個 Logger 對象:Logger logger = Logger.getLogger(“LoggerName”);一般的,使用類名來作為日志記錄器的名稱,這樣做的好處在于能夠盡量減少日志記錄器命名之間的沖突(因為 Java 類使用包名),同時

13、能夠?qū)⑷罩居涗浄诸惖帽M可能的精細(xì)。因此,假定有一 UserManager 類需要使用日志服務(wù),則更一般的使用方式為:Logger logger = Logger.getLogger(UserManager.class);2.          日志分級的實現(xiàn)按照日志目的不同,將日志的級別由低到高分成五個級別:DEBUG        - 表示輸出的日志為一個調(diào)試信息INFO      -

14、 表示輸出的日志是一個系統(tǒng)提示W(wǎng)ARN   - 表示輸出的日志是一個警告信息ERROR - 表示輸出的日志是一個系統(tǒng)錯誤FATAL    - 表示輸出的日志是一個導(dǎo)致系統(tǒng)崩潰嚴(yán)重錯誤這些日志級別定義在 LoggerLevel 接口中,被日志記錄器 Logger 在內(nèi)部使用。而對于日志系統(tǒng)客戶端則可使用 Logger 類接口對直接調(diào)用并輸出這些級別的日志, Logger 的這些接口描述如下:public void debug(String msg);  / 輸出調(diào)試信息public void info(String msg);   / 輸出系統(tǒng)提

15、示public void warn(String msg);   / 輸出警告信息public void fatal(String msg);  / 輸出系統(tǒng)錯誤public void error(String msg);  / 輸出嚴(yán)重錯誤通過對 Logger 對象上這些接口的調(diào)用,直接為日志信息賦予了級別屬性,這樣為后繼的按照不同級別進(jìn)行輸出的工作奠定了基礎(chǔ)。3.          日志對象信息的獲取日志對象上包含了一條日志所具備的所有信息。通常這些信

16、息包括:輸 出日志的時間、 Java 類、類成員方法、所在行號、日志體、日志級別等等。在 JDK1.4 中可以通過在方法中拋出并且捕獲住一個異常,則在捕捉到的異常對象中已經(jīng)由 JVM 自動填充好了系統(tǒng)調(diào)用的堆棧,在 JDK1.4 中則可以使用 java.lang.StackTraceElement 獲取到每一個堆棧項的基本信息,通過對日志客戶端輸出日志方法調(diào)用層數(shù)的推算,則可以比較容易的獲取到 StackTraceElement 對象,從而獲取到輸出日志時的 Java 類、類成員方法、所在行號等信息。在 JDK1.3 或者更早的版本中,相應(yīng)的工作則必須通過將異常的堆棧信息輸出到字符串中,并分析

17、該字符串格式得到。2.3          日志 輸出部分 的設(shè)計日志輸出部分的設(shè)計具有一定的難度,在本文設(shè)計的日志系統(tǒng)中,日志的輸出、多線程的支持、日志系統(tǒng)的擴(kuò)展性、日志系統(tǒng)的效率等問題都交由日志輸出部分進(jìn)行管理。1.          日志輸出器的繼承結(jié)構(gòu)在日志的輸出部分采用了二層結(jié)構(gòu),即定義了一個抽象的日志輸出器( AbstractLoggerAppender ) , 然

18、后從該抽象類繼承出實際的日志輸出器。 AbstractLoggerAppender 定義了一系列的對日志進(jìn)行過濾的方法,而具體輸出到存儲媒介的方法則是一個抽象方法,由子類實現(xiàn)。在系統(tǒng)中默認(rèn)實現(xiàn)了控制臺輸出器和文件輸出器兩種,其中 控制臺輸出器的實現(xiàn)頗為簡單。2.          文件輸出器的內(nèi)部實現(xiàn)在日志記錄部分的實現(xiàn)中,并沒有考慮多線程、高效率等問題,因此文 件輸出器必須考慮這些問題的處理。在文件輸出器內(nèi)部使用 java.lang.Vector 定 義了一個線程安全的高速緩沖,所有通過日志記

19、錄部分分派到文件輸出器的日志被直接放置到該高速緩沖當(dāng)中。同時在文件輸出器內(nèi)部定義一個工作線程,負(fù)責(zé)定期 將高速緩沖中的內(nèi)容保存到文件,在保存的過程中同時可以進(jìn)行日志文件的備份等工作。由于采用了高速緩沖的結(jié)構(gòu),很顯然日志客戶端的調(diào)用已經(jīng)不再是一個同步 調(diào)用,從而不再會需要等到文件操作后才返回,提高的系統(tǒng)調(diào)用的速度。該原理 如圖 3 所示: 圖 3 ,文件輸出器內(nèi)部結(jié)構(gòu)2.4          設(shè)計難點通過上述設(shè)計,一個具有良好擴(kuò)展能力的高性能日志系統(tǒng)框架就已經(jīng)具有了一定的雛形。在設(shè)計過程中幾個難點問題需要進(jìn)一步反思。一、是否整個系統(tǒng)應(yīng)當(dāng)采用完全異步的結(jié)構(gòu),通過類似于消息機(jī)制的方式來進(jìn)行由日志客戶端發(fā)送日志給日志系統(tǒng)。這種方式可以作為日志系統(tǒng)框架另一種運行方式

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論