下圖是Log4j官網給出的類圖:
html
咱們先依次看一下每一個類的定義是什麼。java
LoggerContext
// todo 不太理解數據庫
Configuration
Configuration
類對應的是正在使用的配置文件,例如log4j2.xml
。它包含了全部可用的Appender
、LoggerConfig
、以及Filter
的定義。apache
During reconfiguration two Configuration objects will exist. Once all Loggers have been redirected to the new Configuration, the old Configuration will be stopped and discarded.
在從新配置時(即配置文件有改動時),可能會並存兩個Configuration
對象。一旦全部的Logger
都被重定向到新的配置,舊配置對應的Configuration
對象就會被廢棄。
Logger
Logger
對象經過LogManager.getLogger
方式得到,通常每一個類都有各自的Logger
對象,名稱與該類的全量名一致。Logger
應該只是一個接口,自己不執行任何直接操做。,擁有名字並與一個LoggerConfig
相關聯。服務器
The Logger itself performs no direct actions. It simply has a name and is associated with a LoggerConfig.
Logger
的行爲由與其關聯的LoggerConfig
控制,當其與其餘的LoggerConfig
相關聯時,它的行爲也會做相應的改變。app
LoggerConfig
LoggerConfig
對象對應着配置文件(例如log4j2.xml
)中的<Logger>
。它包含了一系列Filter
定義以及對一系列Appender
的引用。socket
LoggerConfig objects are created when Loggers are declared in the logging configuration.
Log4j 1.x與Log4j 2.x的不一樣在於,日誌的層次結構發生了變化。在1.x中,日誌的層次結構是經過Logger
之間的關係維護的,而在2.x中,是用LoggerConfig
對象之間的關係維護的。this
In Log4j 1.x the Logger Hierarchy was maintained through a relationship between Loggers. In Log4j 2 this relationship no longer exists. Instead, the hierarchy is maintained in the relationship between LoggerConfig objects.
在Log4j 2.x中,Logger
和LoggerConfig
會根據名稱進行關聯,並且它們的命名都知足以下的層次關係:
名爲java
的LoggerConfig
是名爲java.util
的LoggerConfig
父配置,是名爲java.util.Vector
的LoggerConfig
的祖先配置。
反過來,名爲java.util.Vector
的LoggerConfig
是名爲java.util
的LoggerConfig
的子配置,是名爲java
的LoggerConfig
的子孫配置。spa
A LoggerConfig is said to be an ancestor of another LoggerConfig if its name followed by a dot is a prefix of the descendant logger name. A LoggerConfig is said to be a parent of a child LoggerConfig if there are no ancestors between itself and the descendant LoggerConfig.
Root LoggerConfig
在整個LoggerConfig
體系的最頂層,它沒有任何祖先配置。能夠經過LogManager.getLogger(LogManager.ROOT_LOGGER_NAME)
或LogManager.getRootLogger()
的方式得到與Root LoggerConfig
相關聯的Logger
。日誌
在Log4j 2.x中,每一個LoggerConfig
都會被分配一個Log level
。Log4j 2.x內建支持的Log level
爲:TRACE < DEBUG < INFO < WARN < ERROR < FATAL。除了這些內建等級,Log4j 2.x也容許用戶去自定義等級(不過官方並不推薦這麼作)。
除了等級機制,可使用Marker
機制來實現更細粒度的控制,更多信息請參考[]()。
接下來,咱們用下面5組實例來介紹一下Log4j 2.x中的Level Inheritance
(等級繼承)機制。
Logger Name | Assigned LoggerConfig | LoggerConfig Level | Logger Level |
---|---|---|---|
root | root | DEBUG | DEBUG |
X | root | DEBUG | DEBUG |
X.Y | root | DEBUG | DEBUG |
X.Y.Z | root | DEBUG | DEBUG |
上表中,只有名爲root的Logger
被賦予了名爲root的LoggerConfig
且LoggerConfig
的等級爲DEBUG,因此名爲root的Logger
的等級也爲DEBUG。其它的Logger
都沒有特別分配LoggerConfig
,所以會繼承它們的祖先配置root。
Logger Name | Assigned LoggerConfig | LoggerConfig Level | Logger Level |
---|---|---|---|
root | root | DEBUG | DEBUG |
X | X | ERROR | ERROR |
X.Y | X.Y | INFO | INFO |
X.Y.Z | X.Y.Z | WARN | WARN |
上表中,每一個Logger
都與各自同名的LoggerCongfig
所關聯,所以它們的等級都與相關聯的LoggerConfig
的等級保持一致。
Logger Name | Assigned LoggerConfig | LoggerConfig Level | Logger Level |
---|---|---|---|
root | root | DEBUG | DEBUG |
X | X | ERROR | ERROR |
X.Y | X | ERROR | ERROR |
X.Y.Z | X.Y.Z | WARN | WARN |
上表中,惟獨沒有爲名爲X.Y的Logger
分配同名的LoggerConfig
,所以它將與名爲X的LoggerConfig
相關聯(父配置,而非是祖先配置root)。
Logger Name | Assigned LoggerConfig | LoggerConfig Level | Logger Level |
---|---|---|---|
root | root | DEBUG | DEBUG |
X | X | ERROR | ERROR |
X.Y | X.Y | INFO | INFO |
X.YZ | X | ERROR | ERROR |
從上表中能夠看出,層次結構是以
.
做爲分割的,而不是最長的名稱匹配長度。因此X.YZ的父配置爲X,而不是X.Y。
Logger Name | Assigned LoggerConfig | LoggerConfig Level | Logger Level |
---|---|---|---|
root | root | DEBUG | DEBUG |
X | X | ERROR | ERROR |
X.Y | X.Y | ERROR | |
X.Y.Z | X.Y | ERROR |
上表中,雖然名爲X.Y的Logger
與其同名LoggerCongfig
相關聯,但未被賦予等級,將繼承名爲X的LoggerConfig
的等級ERROR。
下標展現了根據等級的過濾規則:
Event Level | LoggerConfig Level | |||||||
---|---|---|---|---|---|---|---|---|
- | TRACE | DEBUG | INFO | WARN | ERROR | FATAL | OFF | |
ALL | YES | YES | YES | YES | YES | YES | YES | |
TRACE | YES | NO | NO | NO | NO | NO | NO | |
DEBUG | YES | YES | NO | NO | NO | NO | NO | |
INFO | YES | YES | YES | NO | NO | NO | NO | |
WARN | YES | YES | YES | YES | NO | NO | NO | |
ERROR | YES | YES | YES | YES | YES | NO | NO | |
FATAL | YES | YES | YES | YES | YES | YES | NO | |
OFF | NO | NO | NO | NO | NO | NO | NO |
Appender
Appender
指日誌輸出的目的地。Log4j 2.x支持控制檯、文件、遠程socket服務器、Apache Flume、JMS、遠程Unix Syslog守護進程和數據庫API等做爲日誌輸出的目的地。關於這些類型的詳細信息,請參考Appenders。
In log4j speak, an output destination is called an Appender.
Layout
Filter
StrSubsitutor
和StrLookup