Log4j使用下圖所示的類。html
使用Log4j 2 API的應用程序將從LogManager請求具備特定名稱的Logger。LogManager將定位適當的LoggerContext,而後從中獲取Logger。若是必須建立Logger,它將與LoggerConfig相關聯,LoggerConfig包含 a)與Logger相同的名字,b)父包的名字,或 c) root LoggerConfig。LoggerConfig對象是從配置中的Logger聲明建立的。LoggerConfig與實際交付LogEvents的Appenders相關聯。apache
與普通System.out.println相比,任何日誌API的第一個也是最重要的優勢是:可以禁用某些日誌語句,同時容許其餘日誌語句不受阻礙地打印。這個功能假定日誌空間,也就是全部可能日誌語句的空間,是根據開發人員選擇的一些標準進行分類的。api
在Log4j 1.x 裏,Logger層次結構是經過Logger之間的關係來維護的。在Log4j 2中,這種關係再也不存在。相反,層次結構是在LoggerConfig對象之間的關係中維護的。app
Logger和LoggerConfig是命名實體。日誌記錄器名稱區分大小寫,它們遵循分層命名規則。spa
LoggerContext充當日誌系統的錨點。可是,根據具體狀況,應用程序中可能有多個活動的LoggerContexts 。有關LoggerContext的更多細節見日誌分隔部分。日誌
每一個LoggerContext都有一個活動的Configuration。Configuration包含全部Appenders、上下文範圍的Filters、LoggerConfigs,幷包含對StrSubstitutor的引用。在從新配置期間,將存在兩個配置對象。一旦全部Logger被重定向到新的Configuration,舊的Configuration將被中止並丟棄。htm
如前所述,Logger是經過調用LogManager.getLogger建立的。Logger自己不執行任何直接操做。它只有一個名稱,並與LoggerConfig關聯。它擴展了AbstractLogger並實現了所需的方法。當配置被修改時,記錄器可能與不一樣的LoggerConfig關聯,從而致使它們的行爲被修改。 對象
因爲以Logger所屬類的名稱命名Logger是一種很是常見的習慣用法,所以提供了方便的方法LogManager.getLogger()來自動使用調用類的徹底限定類名做爲Logger名稱。blog
LoggerConfig對象是在日誌配置中聲明Logger時建立的。LoggerConfig包含一組Filters,LogEvent在傳遞給任何Appenders以前,必須經過這些Filters。它包含用於處理事件的Appenders的引用。繼承
Log4j 1.x和Logback都有「級別繼承」的概念。在Log4j 2中,Logger和LoggerConfigs是兩個不一樣的對象,所以這個概念的實現是不一樣的。每一個Logger引用適當的LoggerConfig,而LoggerConfig又能夠引用它的父類,從而達到相同的效果。(PS. 言下之意,概念沒有變,只不過實現方式有點不同罷了)
與Logback不一樣的是,在ERROR和OFF中間添加了FATAL級別。
除了根據日誌級別自動過濾,如前一節所述,Log4j提供Filters,能夠應用在控制傳遞給任何LoggerConfig以前,控制傳遞給LoggerConfig後但在調用任何Appenders以前,控制傳遞給LoggerConfig後但在調用一個特定的Appender以前,以及每個Appender之中。以一種與防火牆過濾器很是類似的方式,每一個過濾器能夠返回三個結果之一,Accept, Deny或者Neutral。
雖然事件可能被Filter接受,但事件仍然可能沒有被記錄。當事件被pre-LoggerConfig Filter接受,但隨後被LoggerConfig Filter拒絕或被全部appender拒絕時,就會發生這種狀況。
appender可加性的內容仍然能夠參考Logback的。
相似Logback
StrSubstitutor類和StrLookup接口是從Apache Commons Lang中借來的,而後進行了修改,以支持評估LogEvents。此外,Interpolator類是從Apache Commons Configuration中借來的,以容許StrSubstitutor計算來自多個StrLookups的變量。它也被修改以支持評估LogEvents。它們一塊兒提供了一種機制,容許配置引用來自系統屬性、配置文件、ThreadContext映射、LogEvent中的StructuredData的變量。變量能夠在處理配置時解析,也能夠在處理每一個事件時解析(若是組件可以處理的話)。有關更多信息,請參見Lookups 。