日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

log4j 2.x 架构

發(fā)布時(shí)間:2024/4/13 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 log4j 2.x 架构 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

主要組件

  Log4j使用下圖中顯示的類。

  使用Log4j 2 API的應(yīng)用程序?qū)⑾騆ogManager請(qǐng)求具有特定名稱的Logger。LogManager將找到相應(yīng)的LoggerContext,然后從中獲取Logger。如果必須創(chuàng)建Logger,則它將與LoggerConfig相關(guān)聯(lián),該LoggerConfig包含 a)與Logger相同的名稱,b)父包的名稱,或者c)根LoggerConfig。
  LoggerConfig對(duì)象是從配置中的Logger聲明中創(chuàng)建的。LoggerConfig與實(shí)際傳遞LogEvent的Appender相關(guān)聯(lián)。

Logger層次結(jié)構(gòu)

  任何日志API優(yōu)于樸素的System.out.println的優(yōu)勢(shì)在于它能夠禁用某些日志語句,同時(shí)允許其他語句無阻礙地進(jìn)行輸出。這種性能基于記錄空間,即所有可能的記錄語句的空間,按照一些開發(fā)人員選擇的標(biāo)準(zhǔn)進(jìn)行分類。

  在Log4j 1.x中,記錄器層次結(jié)構(gòu)是通過記錄器之間的關(guān)系來維護(hù)的。在Log4j 2中,這種關(guān)系不再存在。相反,這種層次結(jié)構(gòu)通過LoggerConfig對(duì)象之間的關(guān)系來維持。

  Loggers 和LoggerConfigs是已命名的實(shí)體。Logger名稱區(qū)分大小寫,它們遵循分層命名規(guī)則:

命名層次結(jié)構(gòu)
  如果一個(gè)LoggerConfig的名字+‘.’是后代名稱的前綴, 則稱該LoggerConfig是另一個(gè)LoggerConfig 的祖先。
  如果一個(gè)LoggerConfig和后代LoggerConfig之間沒有祖先,此LoggerConfig被稱為是子 LoggerConfig 的父級(jí)。

  例如,名為"com.foo" 的LoggerConfig是名為"com.foo.Bar"的LoggerConfig的父級(jí)。類似地,"java"是 "java.util"的父級(jí)和"java.util.Vector"的祖先。這個(gè)命名方案應(yīng)該是大多數(shù)開發(fā)人員都熟悉的。

  根LoggerConfig位于LoggerConfig層次結(jié)構(gòu)的頂部。作為唯一一個(gè)例外,它始終存在,并且是每個(gè)層次的一部分。直接鏈接到根LoggerConfig的Logger可以如下獲得:

Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
  • 1

  或者

Logger logger = LogManager.getRootLogger();
  • 1

  所有其他的Logger可以使用 LogManager.getLogger 靜態(tài)方法通過傳遞所需記錄器的名稱來檢索。有關(guān)Logging API的更多信息可以在Log4j 2 API中找到。

LoggerContext

  LoggerContext 在記錄系統(tǒng)里充當(dāng)錨點(diǎn)的作用。但根據(jù)具體情況,應(yīng)用程序中可能會(huì)有多個(gè)活動(dòng)的LoggerContext。LoggerContext的更多細(xì)節(jié)在Log Separtion部分。

配置

  每個(gè)LoggerContext都有一個(gè)活動(dòng)的 Configuration。該配置包含所有Appender,覆蓋上下文的Filter,LoggerConfig,并包含對(duì)StrSubstitutor的引用。在重新配置期間,兩個(gè)配置對(duì)象將同時(shí)存在。一旦所有Logger重定向到新的配置,舊的配置將被停止并丟棄。

Logger

  如上所述,Logger是通過調(diào)用LogManager.getLogger創(chuàng)建的 。Logger本身不執(zhí)行直接操作。它只是一個(gè)名字,并與一個(gè)LoggerConfig相關(guān)聯(lián)。它擴(kuò)展了 AbstractLogger 并實(shí)現(xiàn)了所需的方法。如果配置被修改,Logger可能會(huì)與不同的LoggerConfig關(guān)聯(lián),從而導(dǎo)致其行為被修改。

檢索Logger

  使用相同名稱去調(diào)用LogManager.getLogger方法將始終返回對(duì)完全相同的Logger對(duì)象的引用。如:

Logger x = LogManager.getLogger("wombat"); Logger y = LogManager.getLogger("wombat");
  • 1
  • 2

x和y指的是完全相同的Logger對(duì)象。

  Log4j環(huán)境的配置通常在應(yīng)用程序初始化時(shí)完成。首選的方法是讀取配置文件。這在配置中討論。

  Log4j可以很容易地通過軟件組件來命名Logger。這可以通過在每個(gè)類中實(shí)例化一個(gè)Logger來完成,Logger名稱等于該類的完全限定名稱。這是定義Logger的有用和直接的方法。由于日志輸出帶有生成日志記錄器的名稱,因此該命名策略可以輕松識(shí)別日志消息的來源。然而,這只是一種可能的,盡管是通用的命名記錄器的策略。Log4j不限制Logger命名規(guī)則。開發(fā)人員可以根據(jù)需要自由地命名Logger。

  由于在擁有類之后命名“記錄器”是一種常見習(xí)慣用法,所以提供了便捷方法 LogManager.getLogger()來自動(dòng)使用調(diào)用類的完全限定類名作為記錄器名稱。

  盡管如此,以類的名稱來命名Logger似乎是目前已知的最好的策略。

LoggerConfig

  LoggerConfig 對(duì)象是在日志記錄配置中聲明Logger時(shí)創(chuàng)建的。LoggerConfig包含一組過濾器,任何LogEvent必須經(jīng)過過濾后再傳遞給Appender。它還包含一組Appender(應(yīng)用于處理事件)的引用。

日志級(jí)別

  LoggerConfig將被分配一個(gè)日志級(jí)別。內(nèi)置級(jí)別包括TRACE,DEBUG,INFO,WARN,ERROR和FATAL。Log4j 2還支持自定義日志級(jí)別。獲得更多粒度的另一個(gè)機(jī)制是使用標(biāo)記。

  Log4j 1.x 和 Logback 都有“級(jí)別繼承”的概念。在Log4j 2中,Logger和LoggerConfig是兩個(gè)不同的對(duì)象,所以這個(gè)概念的實(shí)現(xiàn)方式有所不同。每個(gè)Logger引用相應(yīng)的LoggerConfig,這個(gè)LoggerConfig又可以引用它的父代,從而達(dá)到相同的效果。

  以下是五個(gè)具有各種指定級(jí)別值的表格以及與每個(gè)Logger關(guān)聯(lián)的結(jié)果級(jí)別。請(qǐng)注意,在所有這些情況下,如果未配置根LoggerConfig,則將為其分配默認(rèn)級(jí)別。

Logger NameAssigned LoggerConfigLoggerCf LevelLogger Level
rootrootDEBUGDEBUG
XrootDEBUGDEBUG
X.YrootDEBUGDEBUG
X.Y.ZrootDEBUGDEBUG

在上述示例1中,只有根Logger被配置并且具有日志級(jí)別。所有其他的Logger引用根LoggerConfig并使用它的Level。

Logger NameAssigned LoggerConfigLoggerCf LevelLogger Level
rootrootDEBUGDEBUG
XXERRORERROR
X.YX.YINFOINFO
X.Y.ZX.Y.ZWARNWARN

在上述示例2中,所有Logger都有一個(gè)已配置的LoggerConfig并從中獲取它們的Level。

Logger NameAssigned LoggerConfigLoggerCf LevelLogger Level
rootrootDEBUGDEBUG
XXERRORERROR
X.YXERRORERROR
X.Y.ZX.Y.ZWARNWARN

在上述示例3中,Logger root、X 和 X.Y.Z 都有一個(gè)名稱相同的LoggerConfig。Logger X.Y 沒有配置的具有匹配名稱的LoggerConfig,因此使用LoggerConfig X的配置, 因?yàn)槠涿Q與Logger的前綴名稱具有最長(zhǎng)匹配。

Logger NameAssigned LoggerConfigLoggerCf LevelLogger Level
rootrootDEBUGDEBUG
XXERRORERROR
X.YXERRORERROR
X.Y.ZXERRORERROR

在上述示例4中,Logger root和X 和都有一個(gè)名稱相同的LoggerConfig。Logger X.Y 和X.Y.Z沒有配置的具有匹配名稱的LoggerConfig,因此使用LoggerConfig X的配置, 因?yàn)槠涿Q與Logger的前綴名稱具有最長(zhǎng)匹配。

Logger NameAssigned LoggerConfigLoggerCf LevelLogger Level
rootrootDEBUGDEBUG
XXERRORERROR
X.YX.YINFOINFO
X.YZXERRORERROR

在上述示例5中,Logger root、X 和 X.Y 都有一個(gè)名稱相同的LoggerConfig。Logger X.YZ 沒有配置的具有匹配名稱的LoggerConfig,因此使用LoggerConfig X的配置, 因?yàn)槠涿Q與Logger的前綴名稱具有最長(zhǎng)匹配。它不與LoggerConfig X.Y關(guān)聯(lián), 因?yàn)榱钆票仨毻耆ヅ?/p>

Logger NameAssigned LoggerConfigLoggerCf LevelLogger Level
rootrootDEBUGDEBUG
XXERRORERROR
X.YX.Y?ERROR
X.Y.ZX.Y?ERROR

在上述示例6中,LoggerConfig X.Y沒有配置級(jí)別,所以它從LoggerConfig X繼承它的級(jí)別。Logger X.Y.Z使用LoggerConfig X.Y,因?yàn)樗鼪]有名稱完全匹配的LoggerConfig。它也從LoggerConfig X繼承它的日志級(jí)別。

級(jí)別過濾原理

  下表說明了級(jí)別過濾的工作原理。在表中,垂直標(biāo)題顯示LogEvent的級(jí)別,而水平標(biāo)題顯示與相應(yīng)的LoggerConfig關(guān)聯(lián)的級(jí)別。交叉點(diǎn)標(biāo)識(shí)是否允許LogEvent進(jìn)行進(jìn)一步處理(YES)或丟棄(NO)。

Event LevelLoggerConfig Level
?TRACEDEBUGINFOWARNERRORFATALOFF
ALLYESYESYESYESYESYESNO
TRACEYESNONONONONONO
DEBUGYESYESNONONONONO
INFOYESYESYESNONONONO
WARNYESYESYESYESNONONO
ERRORYESYESYESYESYESNONO
FATALYESYESYESYESYESYESNO
OFFNONONONONONONO

Filter

  除了上述的自動(dòng)日志級(jí)別過濾之外,Log4j還提供過濾器,可以在控制權(quán)傳遞給任何LoggerConfig之前應(yīng)用;或在控制權(quán)傳遞給LoggerConfig之后但在調(diào)用任何Appender之前應(yīng)用;或在控制權(quán)傳遞給LoggerConfig之后,但在調(diào)用特定的Appender之前應(yīng)用;以及給每個(gè)Appender添加過濾。以與防火墻過濾器非常相似的方式,每個(gè)過濾器可以返回三個(gè)結(jié)果之一:Accept, Deny 或 Neutral。Accept的響應(yīng)意味著不應(yīng)該調(diào)用其他過濾器,并且事件將被處理。Deny的回應(yīng)意味著事件應(yīng)該立即被忽略,控制權(quán)應(yīng)該返回給調(diào)用者。Neutral的響應(yīng)表示該事件應(yīng)該傳遞給其他過濾器。如果沒有其他過濾器,事件將被處理。

注:一個(gè)事件可能被一個(gè)過濾器接受,但事件仍然可能不會(huì)被記錄。這種情況發(fā)生在事件被pre-LoggerConfig過濾器接受,但是被LoggerConfig過濾器拒絕,或被所有Appender拒絕。

Appender

  根據(jù)logger選擇性地啟用或禁用記錄請(qǐng)求的能力只是Log4j的其中一個(gè)作用。Log4j允許記錄請(qǐng)求打印到多個(gè)目的地。在Log4j中,輸出目標(biāo)被稱為 Appender。目前,控制臺(tái),文件,遠(yuǎn)程套接字服務(wù)器,Apache Flume,JMS,遠(yuǎn)程UNIX Syslog守護(hù)程序以及各種數(shù)據(jù)庫(kù)API都有其對(duì)應(yīng)的appender。更多詳細(xì)信息,請(qǐng)參閱Appender部分 。一個(gè)Logger可以連接多個(gè)Appender。

  可以通過調(diào)用當(dāng)前配置的addLoggerAppender方法將Appender添加到Logger中 。如果與Logger名稱匹配的LoggerConfig不存在,則將創(chuàng)建一個(gè)LoggerConfig,將Appender附加到該LoggerConfig,然后所有Logger被通知去更新其LoggerConfig引用。

  對(duì)于給定的logger,每個(gè)啟用的記錄請(qǐng)求將被轉(zhuǎn)發(fā)給Logger的LoggerConfig中的所有appender以及LoggerConfig父級(jí)的Appender。 換句話說,Appender是從LoggerConfig層次繼承的。例如,如果將控制臺(tái)appender添加到根日志記錄器,則所有啟用的日志記錄請(qǐng)求將至少在控制臺(tái)上打印。如果此時(shí)一個(gè)file appender添加到名為C的LoggerConfig,那啟用日志請(qǐng)求時(shí)C和C的子級(jí)將在一個(gè)文件和在控制臺(tái)上打印。可以重寫此默認(rèn)行為,通過在配置文件的Logger聲明中設(shè)置additivity = "false",可使Appender累積功能不再具有可加性。

以下總結(jié)了Appender可加性的規(guī)則。

Appender的可加性
  Logger L的日志語句的輸出將傳遞到LoggerConfig L 自身祖先中關(guān)聯(lián)的所有Appender。這就是“appender additivity”的意思。
  
  但是,如果與Logger L關(guān)聯(lián)的LoggerConfig祖先 P,將其可加性標(biāo)志設(shè)為false,那么L的輸出將被傳遞到LoggerConfig L和它的祖先直至P(包括P)中所有的appender,但不會(huì)傳遞至P的祖先中所關(guān)聯(lián)的Appenders 。
  
  記錄器默認(rèn)情況下將其可加性標(biāo)志設(shè)置為true。

Logger NameAdded AppendersActivity FlagOutput TargetsComment
rootA1不適用A1根記錄器沒有父對(duì)象,所以可加性不適用于它。
xA-x1, A-x2trueA1, A-x1, A-x2“x”和root的Appenders。
x.ytrueA1, A-x1, A-x2“x”和root的Appenders,沒有配置Appender的logger是不常見的。
x.y.zA-xyz1trueA1, A-x1, A-x2, A-xyz1“x.y.z”、”x”和root的Appenders。
securityA-secfalseA-sec由于可加性標(biāo)志設(shè)置為false,所以沒有appender的積累。
security.accesstrueA-sec只有”security”的appender,因?yàn)椤眘ecurity”中的可加性標(biāo)志被設(shè)置為false。

Layout

  多數(shù)情況下,用戶希望不僅自定義輸出目標(biāo),而且還要自定義輸出格式。這是通過將Layout與Appender關(guān)聯(lián)來實(shí)現(xiàn)的 。布局負(fù)責(zé)根據(jù)用戶的意愿格式化LogEvent,而appender負(fù)責(zé)將格式化的輸出發(fā)送到目的地。所述的PatternLayout,是log4j分發(fā)標(biāo)準(zhǔn)的一部分,能讓用戶根據(jù)類似于C語言的printf函數(shù)的轉(zhuǎn)換模式來指定輸出格式。

  例如,具有轉(zhuǎn)換模式“%r [%t]%-5p%c - %m%n”的PatternLayout將輸出類似于:

176 [main] INFO org.foo.Bar - Located nearest gas station.
  • 1

  第一個(gè)字段是程序啟動(dòng)以來經(jīng)過的毫秒數(shù)。第二個(gè)字段是處理日志請(qǐng)求的線程。第三個(gè)字段是日志語句的級(jí)別。第四個(gè)字段是與日志請(qǐng)求關(guān)聯(lián)的logger的名稱。“ - ”后面的文字是該陳述的訊息。

  Log4j 為各種用例(如JSON,XML,HTML和Syslog(包括新的RFC 5424版本))提供了許多不同的布局。其他appender(如數(shù)據(jù)庫(kù)連接器)將填充指定的字段而不是特定的文本布局。

  同樣重要的是,log4j將根據(jù)用戶指定的標(biāo)準(zhǔn)呈現(xiàn)日志消息的內(nèi)容。例如,如果您經(jīng)常需要記錄當(dāng)前項(xiàng)目中使用的對(duì)象類型Oranges,則可以創(chuàng)建一個(gè)接受Orange實(shí)例的OrangeMes??sage類并將其傳遞給Log4j,以便在將Orange對(duì)象格式化為合適的字節(jié)數(shù)組時(shí)需要。

StrSubstitutor和StrLookup

  該 StrSubstitutor 類和 StrLookup 接口是從Apache Commons Lang中借用的,然后加以修改來支持評(píng)估LOGEVENTS。另外 Interpolator 類是從Apache Commons Configuration借用來允許StrSubstitutor評(píng)估來自多個(gè)StrLookups的變量。它也被修改為支持評(píng)估LogEvents。上述代碼提供了一種機(jī)制,允許配置引用來自系統(tǒng)屬性,配置文件,LogEvent中的ThreadContext Map,StructuredData的變量。如果組件能夠處理它,則可以在處理配置時(shí)或處理每個(gè)事件時(shí)解析變量。請(qǐng)參閱 Lookups 了解更多信息。


原文鏈接:Architecture
譯文鏈接:http://blog.csdn.net/why_still_confused/article/details/79097136
版權(quán)聲明:本文為博主原創(chuàng)翻譯文章,若要轉(zhuǎn)載請(qǐng)注明文章出處

總結(jié)

以上是生活随笔為你收集整理的log4j 2.x 架构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。