log4j2源碼分析

目錄

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)如下:


組件架構(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)行日志追加


    默認(rè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字符串等等.

類體系如下:


layout類體系

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繼承體系如下:


manager繼承體系

7.Filter

過濾器的核心職責(zé)就是對LogEvent日志事件進(jìn)行匹配,匹配結(jié)果分為匹配和不匹配,結(jié)果值有3種:接受,拒絕,中立.可由用戶自定義匹配和不匹配的行為結(jié)果.

所有實(shí)現(xiàn)了Filterable接口的組件都可以引用一個(gè)過濾器進(jìn)行事件過濾,包含LoggerConfigAppenderControl等.

框架實(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)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市舷嗡,隨后出現(xiàn)的幾起案子吉挣,更是在濱河造成了極大的恐慌社付,老刑警劉巖蘸劈,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件月弛,死亡現(xiàn)場離奇詭異胧后,居然都是意外死亡芋浮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門绩卤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來途样,“玉大人,你說我怎么就攤上這事濒憋『蜗荆” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵凛驮,是天一觀的道長裆站。 經(jīng)常有香客問我,道長黔夭,這世上最難降的妖魔是什么宏胯? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮本姥,結(jié)果婚禮上肩袍,老公的妹妹穿的比我還像新娘。我一直安慰自己婚惫,他們只是感情好氛赐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布魂爪。 她就那樣靜靜地躺著,像睡著了一般艰管。 火紅的嫁衣襯著肌膚如雪滓侍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天牲芋,我揣著相機(jī)與錄音撩笆,去河邊找鬼。 笑死缸浦,一個(gè)胖子當(dāng)著我的面吹牛夕冲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播餐济,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼耘擂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了絮姆?” 一聲冷哼從身側(cè)響起醉冤,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎篙悯,沒想到半個(gè)月后蚁阳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸽照,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年膜蛔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赔蒲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窑滞。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡转砖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诞外,到底是詐尸還是另有隱情澜沟,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布峡谊,位于F島的核電站茫虽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏既们。R本人自食惡果不足惜濒析,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啥纸。 院中可真熱鬧号杏,春花似錦、人聲如沸斯棒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绰上,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間渠驼,已是汗流浹背蜈块。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迷扇,地道東北人百揭。 一個(gè)月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蜓席,于是被迫代替她去往敵國和親器一。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 在應(yīng)用程序中添加日志記錄總的來說基于三個(gè)目的:監(jiān)視代碼中變量的變化情況厨内,周期性的記錄到文件中供其他應(yīng)用進(jìn)行統(tǒng)計(jì)分析...
    時(shí)待吾閱讀 4,975評論 0 6
  • 在應(yīng)用程序中添加日志記錄總的來說基于三個(gè)目的:監(jiān)視代碼中變量的變化情況祈秕,周期性的記錄到文件中供其他應(yīng)用進(jìn)行統(tǒng)計(jì)分析...
    時(shí)待吾閱讀 4,985評論 1 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)雏胃,斷路器请毛,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • 拆書部分 《如何聽如何說》,151頁 舉例時(shí)應(yīng)該精挑細(xì)選瞭亮,目的是把你的概括性陳述說得更生動方仿、更易懂一些。許多人感到...
    聽風(fēng)過而閱讀 246評論 0 0
  • 生活中到處存在著經(jīng)濟(jì)學(xué)统翩,經(jīng)濟(jì)學(xué)滲透在生活的方方面面仙蚜。只是我們混然不覺而已。 改變習(xí)慣思維厂汗,善于觀察身邊的事物并學(xué)會...
    靈魂獸者閱讀 857評論 0 0