目錄
1.概述
1.1.組件概覽
1.2.靈活的配置
1.2.1.插件發(fā)現(xiàn)機(jī)制
1.2.2.插件裝配機(jī)制
1.2.3.配置文件基本元素與對象的映射關(guān)系
2.屬性占位符
2.1.概述
2.2.Interpolator插值器
2.3.默認(rèn)屬性配置
3.Logger
3.1.配置示例
3.2.配置詳解
3.3.Logger繼承機(jī)制
4.Appender
4.1.概述
4.2.框架支持的Appender實(shí)現(xiàn)
4.3.常用Appender詳解
4.3.1.ConsoleAppender
4.3.2.RollingFileAppender
5.Layout
5.1.概述
5.2.PatternLayout
5.2.1.模式字符串
6.Manager
7.Filter
1.概述
1.1.組件概覽
在log4j2中,LogManager就是日志的門面,相當(dāng)于slf4j-api中的LoggerFactory.
框架為每個(gè)類加載分配了一個(gè)單獨(dú)的LoggerContext,用于管理所有創(chuàng)建出來的Logger實(shí)例.
ContextSelector則負(fù)責(zé)管理類加載器到對應(yīng)的LoggerContext實(shí)例之間的映射關(guān)系.
log4j2中,有5個(gè)關(guān)鍵概念:
- LoggerConfig:日志配置,用于整合多個(gè)Appender,進(jìn)行日志打印.
- Appender:追加器,用于操作Layout和Manager,往單一目的地進(jìn)行日志打印.
- Layout:布局,用于把LogEvent日志事件序列化成字節(jié)序列,不同Layout實(shí)現(xiàn)具有不同的序列化方式.
- Manager:管理器,用于管理輸出目的地,如:RollingFileManager用于管理文件滾動以及將字節(jié)序列寫入到指定文件中.
- Filter:過濾器,用于對LogEvent日志事件加以過濾,LoggerConfig和Appender都可以配置過濾器,也就是說日志事件會經(jīng)過一總一分兩層過濾.
組件架構(gòu)如下:
1.2.靈活的配置
1.2.1.插件發(fā)現(xiàn)機(jī)制
在log4j2中,一切皆插件,框架通過PluginRegistry
掃描并發(fā)現(xiàn)插件配置.
PluginRegistry
支持兩種掃描方式
- 一種是使用指定的ClassLoader讀取classpath下所有的
META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat
文件,產(chǎn)生PluginType
; - 另一種是掃描classpath下指定的packageName,內(nèi)省帶有
@Plugin
注解的類文件,產(chǎn)生PluginType
.
插件配置以PluginType
的形式保存在插件注冊表中,PluginType
的作用類似于spring中BeanDefinition
,定義了如何創(chuàng)建插件實(shí)例.
插件類通過@PluginFactory
注解或者@PluginBuilderFactory
注解配置插件實(shí)例的實(shí)例化和屬性注入方式.
1.2.2.插件裝配機(jī)制
log4j2知道如何實(shí)例化插件后,我們就可以通過編寫配置文件(如:log4j2.xml),進(jìn)行插件的實(shí)例化和屬性注入了.
Configuration
全局配置對象負(fù)責(zé)保存所有解析到的配置.
通過ConfigurationFactory.getConfiguration()
可以使用不同的工廠生產(chǎn)不同的配置對象,不同的Configuration
實(shí)現(xiàn)可以解析不同格式的配置,如:xml,yaml,json等.
以xml文件為例,文件中每個(gè)元素都會最終對應(yīng)一個(gè)插件實(shí)例,元素名稱實(shí)際就是PluginType中的name,實(shí)例的屬性可以從子元素對應(yīng)的實(shí)例獲取,也可以從自身元素的屬性配置獲取.
因此,xml中dom樹的元素嵌套關(guān)系,也就是log4j組件實(shí)例的引用嵌套關(guān)系.
xml,yaml,json格式文件都可以描述這種嵌套關(guān)系,因此log4j2中定義了與文件格式無關(guān)的數(shù)據(jù)結(jié)構(gòu),Node來抽象配置.
AbstractConfiguration.setup()
負(fù)責(zé)提取配置,形成Node樹.
AbstractConfiguration.doConfigure()
負(fù)責(zé)根據(jù)Node樹,進(jìn)行插件實(shí)例化和屬性注入.
1.2.3.配置文件基本元素與對象的映射關(guān)系
序號 | xml元素 | 工廠方法(類名.方法名) | 對象類型 |
---|---|---|---|
1 | <Properties> | PropertiesPlugin.configureSubstitutor() |
StrLookup |
2 | <Property> | Property.createProperty() |
Property |
3 | <Loggers> | LoggersPlugin.createLoggers() |
Loggers |
4 | <Logger> | LoggerConfig.createLogger() |
LoggerConfig |
5 | <Root> | RootLogger.createLogger() |
LoggerConfig |
6 | <AppenderRef> | AppenderRef.createAppenderRef() |
AppenderRef |
7 | <Filters> | CompositeFilter.createFilters() |
CompositeFilter |
8 | <Appenders> | AppendersPlugin.createAppenders() |
ConcurrentMap<String, Appender> |
2.屬性占位符
2.1.概述
在log4j2中,環(huán)境變量信息(鍵值對)被封裝為StrLookup對象,該對象作用類似于spring框架中的PropertySource.
在配置文件中,基本上所有的值的配置都可以通過參數(shù)占位符引用環(huán)境變量信息,格式為:${prefix:key}.
2.2.Interpolator插值器
Interpolator內(nèi)部以Map<String,StrLookup>的方式,封裝了很多StrLookuo對象,key則對應(yīng)參數(shù)占位符${prefix:key}中的prefix.
同時(shí),Interpolator內(nèi)部還保存著一個(gè)沒有prefix的StrLookup實(shí)例,被稱作默認(rèn)查找器,它的鍵值對數(shù)據(jù)來自于log4j2.xml配置文件中的<Properties>元素的配置.
當(dāng)參數(shù)占位符${prefix:key}帶有prefix前綴時(shí),Interpolator會從指定prefix對應(yīng)的StrLookup實(shí)例中進(jìn)行key查詢,
當(dāng)參數(shù)占位符${key}沒有prefix時(shí),Interpolator則會從默認(rèn)查找器中進(jìn)行查詢.
Interpolator中默認(rèn)支持的StrLookup查找方式如下(StrLookup查找器實(shí)現(xiàn)類均在org.apache.logging.log4j.core.lookup包下):
序號 | prefix | 插件類型 | 描述 |
---|---|---|---|
1(*) | sys | SystemPropertiesLookup | 從jvm屬性中查找 |
2(*) | env | EnvironmentLookup | 從操作系統(tǒng)環(huán)境變量中獲取value |
3 | marker | MarkerLookup | 判斷以指定key為名稱的Marker標(biāo)簽是否存在,存在則返回key,否則返回null |
4 | jvmrunargs | JmxRuntimeInputArgumentsLookup | 獲取jmx的運(yùn)行時(shí)輸入?yún)?shù) |
5 | bundle | ResourceBundleLookup | 通過ResourceBundle查找value,格式:${prefix:bundleName:bundleKey} |
6 | java | JavaLookup | 獲取jvm進(jìn)程信息,只指定固定的key值,包括:(1)version:jdk版本(2)runtime:運(yùn)行環(huán)境信息(3)vm:虛擬機(jī)名稱(4)os:操作系統(tǒng)信息(5)hw:硬件信息(6)locale:地區(qū)信息 |
7 | main | MainMapLookup | 暫未啟用 |
8 | log4j | Log4jLookup | 只支持兩個(gè)key:(1)configLocation:獲取log4j2配置文件的絕對路徑(2)configParentLocation:獲取配置文件所在目錄的絕對路徑 |
9 | date | DateLookup | 以指定格式,獲取當(dāng)前系統(tǒng)時(shí)間或LogEvent的時(shí)間戳,通過key來指定日期格式字符串 |
10 | sd | StructuredDataLookup | 從LogEvent中引用的StructuredDataMessage中獲取value |
11 | ctx | ContextMapLookup | 從ThreadContext中獲取value |
12 | map | MapLookup | 暫未啟用 |
13 | jndi | JndiLookup | 使用jndi(javax.naming)獲取value |
2.3.默認(rèn)屬性配置
注意:Properties元素一定要配置在最前面,否則不生效.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Properties>
<Property name="customKey_1">customValue_1</Property>
<Property name="customKey_2">customValue_2</Property>
</Properties>
</Configuration>
3.Logger
3.1.配置示例
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" dest="err" verbose="false">
<Appenders>
<Console name="console">
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %C.%M %message%n"/>
</Console>
</Appenders>
<Loggers>
<Root additivity="true" level="error" includeLocation="true" >
<AppenderRef ref="console" level="info">
<ThresholdFilter level="warn" onMatch="NEUTRAL" onMismatch="DENY"/>
</AppenderRef>
<Property name="customeKey">customeValue</Property>
<ThresholdFilter level="warn" onMatch="NEUTRAL" onMismatch="DENY"/>
</Root>
<Logger name="com.lixin" additivity="true" level="info" includeLocation="true">
<AppenderRef ref="console" level="info">
<ThresholdFilter level="warn" onMatch="NEUTRAL" onMismatch="DENY"/>
</AppenderRef>
<Property name="customeKey">customeValue</Property>
<ThresholdFilter level="warn" onMatch="NEUTRAL" onMismatch="DENY"/>
</Logger>
</Loggers>
</Configuration>
3.2.配置詳解
- additivity:日志可加性,如果配置為true,則在日志打印時(shí),會通過Logger繼承關(guān)系遞歸調(diào)用父Logger引用的Appender進(jìn)行日志打印.
注意:該屬性默認(rèn)為true.在遞歸打印日志時(shí),會忽略父Logger的level配置 - level:用于控制允許打印的日志級別上線,在配置示例中,只有級別<=info的LogEvent才會被放行,級別優(yōu)先級順序?yàn)镺FF<FATAL<ERROR<WARN<INFO<DEBUG<TRACE<ALL
注意:level屬性的配置時(shí)可選的,在獲取level時(shí)會通過Logger繼承關(guān)系遞歸獲取,RootLogger的級別默認(rèn)為error,其他默認(rèn)為null.也就是說,如果全都不配置level的話,則所有Logger級別都默認(rèn)為error. - includeLocation:如果配置為true,則打印日志時(shí)可以附帶日志點(diǎn)源碼位置信息輸出.同步日志上下文默認(rèn)為true,異步默認(rèn)為false.
- LoggerConfig元素下可以單獨(dú)配置Property元素,添加屬性鍵值對,這些屬性會在每次打印日志時(shí),被追加到LogEvent的contextData中
- LoggerConfig支持配置過濾器,在判斷是否打印日志時(shí),先過濾器判斷過濾,然后再級別判斷過濾.
- AppenderRef:顧名思義,就是配置當(dāng)前Logger引用的Appender.同時(shí),AppenderRef也支持配置level和Filter,進(jìn)行更細(xì)粒度的日志過濾
- LoggerConfig等于總開關(guān),AppenderRef則為各個(gè)子開關(guān),兩個(gè)開關(guān)都通過才能打印日志
3.3.Logger繼承機(jī)制
log4j2框架會根據(jù)LoggerConfig的name建立對象之間的繼承關(guān)系.這種繼承機(jī)制與java的package很像,name以點(diǎn)進(jìn)行名稱空間分割,子名稱空間繼承父名稱空間.
名稱空間可以是全限定類名,也可以是報(bào)名.整個(gè)配置樹的根節(jié)點(diǎn)就是RootLogger.
舉例:假如我們的配置的Logger如下:
<Root/>
<Logger name="com"/>
<Logger name="com.lixin.DemoClass"/>
<Logger name="org"/>
<Logger name="org.springframework"/>
當(dāng)通過LogManager.getLogger(name)獲取Logger實(shí)例時(shí),會根據(jù)name逐級遞歸直到找到匹配的LoggerConfig,或者遞歸到Root根節(jié)點(diǎn)為止.
4.Appender
4.1.概述
追加器,負(fù)責(zé)控制Layout進(jìn)行LogEvent的序列化,以及控制Manager對序列化后的字節(jié)序列進(jìn)行輸出.
在log4j2.xml配置文件中,配置方式如下:
<Appenders>
<具體的Appender插件名稱>
</具體的Appender插件名稱>
</Appenders>
4.2.框架支持的Appender實(shí)現(xiàn)
序號 | 工廠方法 | xml元素 | 具體類 | 作用 |
---|---|---|---|---|
1 | NullAppender.createAppender | <Null> | NullAppender | |
2 | ConsoleAppender.newBuilder | <Console> | ConsoleAppender | 控制臺輸出 |
3 | FileAppender.newBuilder | <File> | FileAppender | 往一個(gè)固定文件,流式追加日志 |
5 | RollingFileAppender.newBuilder | <RollingFile> | RollingFileAppender | 日志文件可滾動,滾動策略可配置,可按時(shí)間,文件大小等方式.流式追加日志 |
6 | AsyncAppender.newBuilder | <Async> | AsyncAppender | 內(nèi)部引用一組appender,通過異步線程+隊(duì)列方式調(diào)用這些appender |
7 | RollingRandomAccessFileAppender.newBuilder | <RollingRandomAccessFile> | RollingRandomAccessFileAppender | 日志文件可滾動,使用RandomAccessFile追加日志 |
8 | RandomAccessFileAppender.newBuilder | <RandomAccessFile> | RandomAccessFileAppender | 往一個(gè)固定文件,使用RandomAccessFile追加日志 |
8 | OutputStreamAppender.newBuilder | <OutputStream> | OutputStreamAppender | |
9 | MemoryMappedFileAppender.newBuilder | <MemoryMappedFile> | MemoryMappedFileAppender | 比RandomAccessFile性能高 |
10 | JdbcAppender.newBuilder | <JDBC> | JdbcAppender | |
11 | JpaAppender.createAppender | <JPA> | JpaAppender | |
12 | JeroMqAppender.createAppender | <JeroMQ> | JeroMqAppender | |
13 | KafkaAppender.newBuilder | <Kafka> | KafkaAppender | |
14 | JmsAppender.newBuilder | <JMS> <JMSQueue> <JMSTopic> |
JmsAppender | |
15 | Rewrite.createAppender | <Rewrite> | RewriteAppender | |
16 | RoutingAppender.newBuilder | <Routing> | RoutingAppender | 路由追加器 可根據(jù)pattern模式字符串,路由到內(nèi)部管理的其他Appender實(shí)例, 支持LogEvent事件重寫和Appender定期清理 |
17 | CountingNoOpAppender.createAppender | <CountingNoOp> | CountingNoOpAppender | |
18 | FailoverAppender.createAppender | <Failover> | FailoverAppender | |
19 | ScriptAppenderSelector | <ScriptAppenderSelector> | ||
20 | SmtpAppender.createAppender | <SMTP> | SmtpAppender | |
21 | SocketAppender.newBuilder | <Socket> | SocketAppender | |
22 | SyslogAppender.newBuilder | <Syslog> | SyslogAppender | |
23 | WriterAppender.newBuilder | <Writer> | WriterAppender |
4.3.常用Appender詳解
4.3.1.ConsoleAppender
控制臺追加器,用于把日志輸出到控制臺,一般本地調(diào)試時(shí)使用.
配置示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" dest="err" verbose="false">
<Appenders>
<!-- follow和direct不能同時(shí)為true,如果follow為true則會跟隨底層輸出流的變化,direct為true則固定指向輸出流 -->
<Console name="console" target="SYSTEM_OUT" follow="false" direct="true">
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %C.%M %message%n"/>
</Console>
</Appenders>
<Loggers>
<Root additivity="true" level="error" includeLocation="true" >
<AppenderRef ref="console" level="info"/>
</Root>
</Loggers>
</Configuration>
4.3.2.RollingFileAppender
文件滾動追加器,用于向本地磁盤文件中追加日志,同時(shí)可以通過觸發(fā)策略(TriggeringPolicy)和滾動策略(RolloverStrategy)控制日志文件的分片,避免日志文件過大.
線上環(huán)境常用.
常用的觸發(fā)策略包含兩種:
- TimeBasedTriggeringPolicy:基于時(shí)間周期性觸發(fā)滾動,一般按天滾動
- SizeBasedTriggeringPolicy:基于文件大小觸發(fā)滾動,可以控制單個(gè)日志文件的大小上限
滾動策略的實(shí)現(xiàn)包含兩種:
-
DefaultRolloverStrategy:默認(rèn)滾動策略
該策略內(nèi)部維護(hù)一個(gè)最小索引和最大索引,每次滾動時(shí),會刪除歷史文件,之后剩余文件全部進(jìn)行一輪重命名,最后創(chuàng)建新的不帶有索引后綴的文件進(jìn)行日志追加
-
DirectWriteRolloverStrategy:直接寫滾動策略
該策略內(nèi)部會維護(hù)一個(gè)一直自增的文件索引,每次滾動時(shí)直接創(chuàng)建新的帶有索引后綴的文件進(jìn)行日志追加,同步清理歷史的文件.
配置示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" dest="err" verbose="false">
<Properties>
<Property name="logDir">/Users/lixin46/workspace/demo/logdemo/logs</Property>
<Property name="pattern">%date{yyyy-MM-dd HH:mm:ss.SSS} %C.%M %message%n</Property>
</Properties>
<Appenders>
<Console name="console" >
<PatternLayout pattern="${pattern}"/>
</Console>
<!-- 使用DirectWriteRolloverStrategy策略時(shí),不需要配置fileName -->
<RollingFile name="fileAppender" fileName="${logDir}/request.log" filePattern="${logDir}/request.log-%d-%i">
<PatternLayout pattern="${pattern}"/>
<!-- 所有策略中,只要任意策略滿足就會觸發(fā)滾動 -->
<Policies>
<!-- 滾動時(shí)間周期,只有數(shù)量,單位取決于filePattern中%d的配置 -->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10b"/>
</Policies>
<!-- 限制最多保留5個(gè)文件,索引自增 -->
<!--<DirectWriteRolloverStrategy maxFiles="5"/>-->
<!-- 限制最多保留5個(gè)文件,索引從2到6 -->
<DefaultRolloverStrategy fileIndex="max" min="2" max="6"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="console" level="info"/>
<AppenderRef ref="fileAppender" level="info" />
</Root>
</Loggers>
</Configuration>
5.Layout
5.1.概述
布局對象,職責(zé)是把指定的LogEvent轉(zhuǎn)換成可序列化對象(如:String),或者直接序列化成字節(jié)數(shù)組.
log4j2支持很多的序列化格式,如:普通模式字符串,JSON字符串,yaml字符串,XML格式字符串,HTML字符串等等.
類體系如下:
5.2.PatternLayout
模式布局是我們最常使用的,它通過PatternProcessor模式解析器,對模式字符串進(jìn)行解析,得到一個(gè)List<PatternConverter>轉(zhuǎn)換器列表和List<FormattingInfo>格式信息列表.
在PatternLayout序列化時(shí),會遍歷每個(gè)PatternConverter,從LogEvent中取不同的值進(jìn)行序列化輸出.
5.2.1.模式字符串
模式字符串由3部分組成,格式為:%(格式信息)(轉(zhuǎn)換器名稱){選項(xiàng)1}{選項(xiàng)2}...
- 格式信息
數(shù)據(jù)結(jié)構(gòu)如下:
public final class FormattingInfo {
// 默認(rèn)配置,右對齊,長度不限,左側(cè)截?cái)? private static final FormattingInfo DEFAULT = new FormattingInfo(false, 0, Integer.MAX_VALUE, true);
// 字段最小長度
private final int minLength;
// 字段最大長度
private final int maxLength;
// 是否左對齊,默認(rèn)為false,長度過短時(shí),左側(cè)填充空白
private final boolean leftAlign;
// 是否左側(cè)截?cái)?默認(rèn)為true,長度過長時(shí),刪除左側(cè)內(nèi)容
private final boolean leftTruncate;
}
模式字符串的格式為:
%-(minLength).-(maxLength)(轉(zhuǎn)換器名稱){選項(xiàng)字符串}
minLength代表字段的最小長度限制,當(dāng)字段內(nèi)容長度小于最小限制時(shí),會進(jìn)行空格填充.
minLength前面的-負(fù)責(zé)控制對齊方式,默認(rèn)為右對齊(左邊空格填充),如果加上-,則會切換為左對齊方式(右邊空格填充)
maxLength代表字段的最大長度限制,當(dāng)字段內(nèi)容長度大于最大限制時(shí),會進(jìn)行內(nèi)容階段
maxLength前面的-負(fù)責(zé)控制階段方向,默認(rèn)為左側(cè)階段,如果加上-,則會切換為右側(cè)階段
minLength和maxLength之間用點(diǎn)分隔.
格式信息中所有屬性都是可選的,不配置,則使用默認(rèn)值
- 轉(zhuǎn)換器名稱
log4j2會通過PluginManager
收集所有類別為Converter的插件,同時(shí)分析插件類上的@ConverterKeys
注解,獲取轉(zhuǎn)換器名稱,并建立名稱到插件實(shí)例的映射關(guān)系.
PatternParser識別到轉(zhuǎn)換器名稱的時(shí)候,會查找映射.
框架支持的所有轉(zhuǎn)換器如下:
序號 | 名稱 | 類型 | 描述 |
---|---|---|---|
1 | d date |
DatePatternConverter | 日志的時(shí)間戳 |
2 | p level |
LevelPatternConverter | 日志級別 |
3 | m msg message |
MessagePatternConverter | 日志中的消息內(nèi)容 |
4 | C class |
ClassNamePatternConverter | 日志打印點(diǎn)所在類的類名 注意:需要給LoggerincludeLocation="true"屬性開啟位置 |
5 | M method |
MethodLocationPatternConverter | 日志打印點(diǎn)所在方法的方法名 注意:需要給LoggerincludeLocation="true"屬性開啟位置 |
6 | c logger |
LoggerPatternConverter | Logger實(shí)例的名稱 |
7 | n | LineSeparatorPatternConverter | 專門追加換行符 |
8 | properties | Log4j1MdcPatternConverter | |
9 | ndc | Log4j1NdcPatternConverter | |
10 | enc encode |
EncodingPatternConverter | |
11 | equalsIgnoreCase | EqualsIgnoreCaseReplacementConverter | |
12 | equals | EqualsReplacementConverter | |
13 | xEx xThroable xException |
ExtendedThrowablePatternConverter | |
14 | F file |
FileLocationPatternConverter | 注意:需要給LoggerincludeLocation="true"屬性開啟位置 |
15 | l location |
FullLocationPatternConverter | 相當(dāng)于%C.%M(%F:%L) 注意:需要給LoggerincludeLocation="true"屬性開啟位置 |
16 | highlight | HighlightConverter | |
17 | L line |
LineLocationPatternConverter | 日志打印點(diǎn)的代碼行數(shù) 注意:需要給LoggerincludeLocation="true"屬性開啟位置 |
18 | K map MAP |
MapPatternConverter | |
19 | marker | MarkerPatternConverter | 打印完整標(biāo)記,格式如:標(biāo)記名[父標(biāo)記名[祖父標(biāo)記名]],一個(gè)標(biāo)記可以有多個(gè)父標(biāo)記 |
20 | markerSimpleName | MarkerSimpleNamePatternConverter | 只打印標(biāo)記的名稱 |
21 | maxLength maxLen |
MaxLengthConverter | |
22 | X mdc MDC |
MdcPatternConverter |
LogEvent.getContextData() 映射診斷上下文 |
23 | N nano |
NanoTimePatternConverter | |
24 | x NDC |
NdcPatternConverter |
LogEvent.getContextStack() 嵌套診斷上下文 |
25 | replace | RegexReplacementConverter | |
26 | r relative |
RelativeTimePatternConverter | |
27 | rEx rThrowable rException |
RootThrowablePatternConverter | |
28 | style | StyleConverter | |
29 | T tid threadId |
ThreadIdPatternConverter | 線程id |
30 | t tn thread threadName |
ThreadNamePatternConverter | 線程名稱 |
31 | tp threadPriority |
ThreadPriorityPatternConverter | 線程優(yōu)先級 |
32 | ex throwable Exception |
ThrowablePatternConverter | 異常 |
33 | u uuid |
UuidPatternConverter | 生成一個(gè)uuid,隨日志一起打印,用于唯一標(biāo)識一條日志 |
34 | notEmpty varsNotEmpty variablesNotEmpty |
VariablesNotEmptyReplacementConverter |
- 選項(xiàng)字符串
有時(shí)我們需要對特定的轉(zhuǎn)換器進(jìn)行特殊的配置,如:給DatePatternConverter配置時(shí)間格式,這個(gè)時(shí)候需要通過選項(xiàng)字符串配置.
PatternParser會提取模式字符串中的所有選項(xiàng),保存在一個(gè)List<String>中,每個(gè){}包裹的內(nèi)容作為一個(gè)選項(xiàng).
當(dāng)創(chuàng)建轉(zhuǎn)換器時(shí),框架會自動掃描轉(zhuǎn)換器類中聲明的靜態(tài)工廠方法newInstance,同時(shí)支持兩種可選的形參,一種是Configuration,另一種String[]則會注入選項(xiàng)列表.
選項(xiàng)列表的識別由不同的轉(zhuǎn)換器各自定義.
最后,以一個(gè)實(shí)際的例子解釋配置:
日志會輸出時(shí)間,類名,方法名,消息以及一個(gè)換行符.
同時(shí),我們給DatePatternConverter指定了了時(shí)間格式,并且限制全限定類名最小長度為5,右截?cái)?最大為10,左對齊.
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %-5.-10C.%M %message%n"/>
6.Manager
管理器的職責(zé)主要是控制目標(biāo)輸出流,以及把保存在ByteBuffer字節(jié)緩沖區(qū)中的日志序列化結(jié)果,輸出到目標(biāo)流中.
如:RollingFileManager需要在每次追加日志之前,進(jìn)行滾動檢查,如果觸發(fā)滾動還會創(chuàng)建新的文件輸出流.
manager繼承體系如下:
7.Filter
過濾器的核心職責(zé)就是對LogEvent
日志事件進(jìn)行匹配,匹配結(jié)果分為匹配和不匹配,結(jié)果值有3種:接受,拒絕,中立.可由用戶自定義匹配和不匹配的行為結(jié)果.
所有實(shí)現(xiàn)了Filterable
接口的組件都可以引用一個(gè)過濾器進(jìn)行事件過濾,包含LoggerConfig
和AppenderControl
等.
框架實(shí)現(xiàn)的過濾器如下:
序號 | 工廠方法(類名.方法名) | xml元素 | 作用 |
---|---|---|---|
1 | BurstFilter.newBuilder | <BurstFilter> | |
2 | DynamicThresholdFilter.createFilter | <DynamicThresholdFilter> | |
3 | LevelRangeFilter.createFilter | <LevelRangeFilter> | |
4 | MapFilter.createFilter | <MapFilter> | |
5 | MarkerFilter.createFilter | <MarkerFilter> | |
6 | RegexFilter.createFilter | <RegexFilter> | |
7 | ScriptFilter.createFilter | <ScriptFilter> | |
8 | StructuredDataFilter.createFilter | <StructuredDataFilter> | |
9 | ThreadContextMapFilter.createFilter | <ThreadContextMapFilter><ContextMapFilter> | |
10 | ThresholdFilter.createFilter | <ThresholdFilter> | 根據(jù)LogEvent的級別進(jìn)行過濾,如果LogEvent.level<=ThresholdFilter.level,則返回匹配的結(jié)果,否則返回不匹配的結(jié)果.如:過濾器為info,日志為error,則error<=info返回匹配結(jié)果 |
11 | TimeFilter.createFilter | <TimeFilter> | 判斷日志時(shí)間是否在指定的時(shí)間區(qū)間內(nèi) |