成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Log4J Java日志框架特性的內部實現

開發 后端
本文探討了日志系統的基本特性、實現日志系統的意義、方法和內部結構,并且給出了一種基于 Java 平臺的日志系統的詳細設計。同時也指出日志系統會向服務化、異步化的方向發展。

由于 Log4J 得到廣泛應用,從使用者的角度考慮,本文所設計的框架,采用了部分 Log4J 的接口和概念,但內部實現則完全不同。使用 Java 實現日志框架,關鍵的技術在于前面提及的Java日志框架特性的內部實現,特別是:日志的分類和級別、日志分發框架的設計、日志記錄器的設計以及在設計中的高性能和高穩定性的考慮。

2.1系統架構

Java日志框架可以分為日志記錄模塊和日志輸出模塊兩大部分。日志記錄模塊負責創建和管理日志記錄器 (Logger) ,每一個 Logger 對象負責按照不同的級別 (LoggerLevel) 接收各種記錄了日志信息的日志對象 (LogItem) , Logger 對象首先獲取所有需要記錄的日志,并且同步地將日志分派給日志輸出模塊。日志輸出模塊則負責日志 輸出器 (Appender) 的創建和管理,以及日志的輸出。系統中允許有多個不同的日志 輸出器 ,日志 輸出器 負責將日志記錄到存儲介質當中。系統結構如下圖 1 所示:

日志系統結構圖 

圖 1 ,Java日志系統結構圖

下圖 2 使用 UML 類圖給出了Java日志系統的架構:

日志系統框架架構圖 

圖 2 ,日志系統框架架構圖

在圖 2 給出的架構中,日志記錄器 Logger 是整個日志系統框架的用戶使用接口,程序員可以通過該接口記錄日志,為了實現對日志進行分類,系統設計允許存在多個 Logger 對象,每一個 Logger 負責一類日志的記錄, Logger 類同時實現了對其對象本身的管理。 LoggerLevel 類定義了整個日志系統的級別,在客戶端創建和發送日志時,這些級別會被使用到。 Logger 對象在接收到客戶端創建和發送的日志消息時,同時將該日志消息包裝成日志系統內部所使用的日志對象 LogItem ,日志對象除了發送端所發送的消息以外,還會包裝諸如發送端類名、發送事件、發送方法名、發送行號等等。這些額外的消息對于系統的跟蹤和調試都非常有價值。包裝好的 LogItem 最終被發送給 輸出器 ,由這些 輸出 器負責將日志信息寫入最終媒介, 輸出器 的類型和個數均不固定,所有的 輸出器 通過 AppenderManager 進行管理,通常通過配置文件即可方便擴展出多個 輸出器 。

2.2日志記錄部分的設計

如前文所述,日志記錄部分負責接收日志系統客戶端發送來的日志消息、日志對象的管理等工作。下面詳細描述了日志記錄部分的設計要點:

1.日志記錄器的管理

系統通過保持多個 Logger 對象的方式來進行日志記錄的分類。每一個 Logger 對象代表一類日志分類。因此, Logger 對象的名稱屬性是其唯一標識,通過名稱屬性獲取一個 Logger 對象:

  1. Logger logger = Logger.getLogger(“LoggerName”);  

一般的,使用類名來作為日志記錄器的名稱,這樣做的好處在于能夠盡量減少日志記錄器命名之間的沖突(因為 Java 類使用包名),同時能夠將日志記錄分類得盡可能的精細。因此,假定有一 UserManager 類需要使用日志服務,則更一般的使用方式為:

  1. Logger logger = Logger.getLogger(UserManager.class);  

2.日志分級的實現

按照日志目的不同,將日志的級別由低到高分成五個級別:

DEBUG - 表示輸出的日志為一個調試信息

INFO      - 表示輸出的日志是一個系統提示

WARN   - 表示輸出的日志是一個警告信息

ERROR - 表示輸出的日志是一個系統錯誤

FATAL    - 表示輸出的日志是一個導致系統崩潰嚴重錯誤

這些日志級別定義在 LoggerLevel 接口中,被日志記錄器 Logger 在內部使用。而對于日志系統客戶端則可使用 Logger 類接口對直接調用并輸出這些級別的日志, Logger 的這些接口描述如下:

  1. public void debug(String msg);  // 輸出調試信息   
  2.  
  3. public void info(String msg);   // 輸出系統提示   
  4.  
  5. public void warn(String msg);   // 輸出警告信息   
  6.  
  7. public void fatal(String msg);  // 輸出系統錯誤   
  8.  
  9. public void error(String msg);  // 輸出嚴重錯誤   

通過對 Logger 對象上這些接口的調用,直接為日志信息賦予了級別屬性,這樣為后繼的按照不同級別進行輸出的工作奠定了基礎。

3.日志對象信息的獲取

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

2.3日志輸出部分的設計

日志輸出部分的設計具有一定的難度,在本文設計的日志系統中,日志的輸出、多線程的支持、日志系統的擴展性、日志系統的效率等問題都交由日志輸出部分進行管理。

1.日志輸出器的繼承結構

在日志的輸出部分采用了二層結構,即定義了一個抽象的日志輸出器( AbstractLoggerAppender ) , 然后從該抽象類繼承出實際的日志輸出器。 AbstractLoggerAppender 定義了一系列的對日志進行過濾的方法,而具體輸出到存儲媒介的方法則是一個抽象方法,由子類實現。在系統中默認實現了控制臺輸出器和文件輸出器兩種,其中控制臺輸出器的實現頗為簡單。

2.文件輸出器的內部實現

在日志記錄部分的實現中,并沒有考慮多線程、高效率等問題,因此文件輸出器必須考慮這些問題的處理。在文件輸出器內部使用 java.lang.Vector 定 義了一個線程安全的高速緩沖,所有通過日志記錄部分分派到文件輸出器的日志被直接放置到該高速緩沖當中。同時在文件輸出器內部定義一個工作線程,負責定期 將高速緩沖中的內容保存到文件,在保存的過程中同時可以進行日志文件的備份等工作。由于采用了高速緩沖的結構,很顯然日志客戶端的調用已經不再是一個同步 調用,從而不再會需要等到文件操作后才返回,提高的系統調用的速度。該原理 如圖 3 所示:

文件輸出器內部結構 

圖 3 ,文件輸出器內部結構

2.4設計難點

通過上述設計,一個具有良好擴展能力的高性能Java日志架就已經具有了一定的雛形。在設計過程中幾個難點問題需要進一步反思。

一、是否整個系統應當采用完全異步的結構,通過類似于消息機制的方式來進行由日志客戶端發送日志給日志系統。這種方式可以作為日志系統框架另一種運行方式,在后繼設計中加以考慮。

二、在文件輸出器中可以看到,目前雖然可以擴展多個日志輸出器,但是目前提供的抽象類中僅僅提供了對日志的過濾機制,而沒有提供的緩存機制,目前的緩存機制被放在文件輸出器中實現,因此在未來的進一步設計中,可以將文件輸出器中的緩存機制上移到抽象類當中。

2.5設計模式

在設計過程中我們特別注意使用了數個經典的設計模式。如: Logger 對象的創建使用了工廠方法模式( Factory Method )、由 AbstractLoggerAppender 和 ConsoleAppender 以及 FileAppender 構成了策略模式( Strategy ),除此以外,還大量使用了單例模式( Singleton )。在設計中適當運用設計模式能夠加快設計進度、提高設計質量。

【編輯推薦】

  1. Java日志系統:不可或缺的跟蹤調試工具
  2. JDK日志分級作為核心API最佳實踐淺析
  3. JDK1.6在LINUX下的安裝配置
  4. 在JDK7 b50中將實現正則表達式命名捕獲組
  5. JDK日志框架介紹及其主要功能淺析
責任編輯:yangsai 來源: 網絡
相關推薦

2013-05-21 10:58:43

Log4jActiveMQSpring

2020-01-07 10:06:26

Slf4jLog4JLogback

2025-01-14 01:00:00

日志接口Log4j

2022-03-25 13:42:15

Log4j漏洞網絡安全

2022-02-13 16:18:57

JetBrainsIntelliJLog4j

2022-02-15 17:51:38

Log4j漏洞網絡安全

2021-12-14 23:44:26

漏洞Log4j項目

2020-11-04 12:33:08

Log4j 2日志Logback

2016-10-21 13:10:18

javalog4jslf4j

2021-04-02 07:58:36

LogbackLog4j2日志

2022-01-02 09:28:38

漏洞Log4j大數據

2021-12-23 09:47:36

Log4jRCE漏洞DoS漏洞

2022-01-10 11:54:54

FTCLog4j聯邦貿易委員會

2021-12-23 11:03:25

Log4j 漏洞漏洞

2022-01-24 10:02:53

漏洞微軟網絡攻擊

2022-03-30 11:29:53

漏洞補丁Spring

2009-06-12 17:03:51

JBoss和log4j

2021-06-03 10:58:16

logbacklog4jJava

2021-12-13 01:49:34

漏洞Log4j代碼

2021-12-24 09:52:31

Traefik Log4J 漏洞
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产乱码久久久久久牛牛 | 91一区二区三区 | 国产免费一区二区三区免费视频 | 中国美女一级黄色片 | 精品电影 | 九九热最新地址 | 午夜伦4480yy私人影院 | 国产美女精品 | 日韩欧美一级精品久久 | 91精品久久久久久久久中文字幕 | 在线免费观看视频黄 | 一区二区三区视频在线观看 | 国产成人99久久亚洲综合精品 | 视频三区| 97超碰站 | 欧美一区二区在线播放 | 亚洲成人精品一区 | 日韩精品一区中文字幕 | 影音先锋欧美资源 | 狠狠色网| 国产精品久久久久久久久久久新郎 | www.欧美视频 | 中文字幕 国产 | 天天综合操 | 亚洲免费精品 | 久久成人一区 | 在线免费观看视频黄 | 免费成人在线网站 | 久久国产精品-国产精品 | 天堂av中文 | 欧美5区| 91在线资源 | 美女天天操 | 91成人免费观看 | 成人av大全| 午夜激情在线视频 | 国产91丝袜在线18 | 日韩免费 | 久久这里有精品 | 亚洲电影第三页 | 视频在线观看一区二区 |