1 日志級別
? ? 日志記錄器(Logger)的行為是分等級的物臂。如下表所示
分為OFF、FATAL产上、ERROR棵磷、WARN、INFO晋涣、DEBUG仪媒、ALL或者您定義的級別。Log4j建議只使用四個級別谢鹊,優(yōu)先級從高到低分別是 ERROR>WARN>INFO>DEBUG算吩。通過在這里定義的級別,您可以控制到應(yīng)用程序中相應(yīng)級別的日志信息的開關(guān)佃扼。比如在這里定義了INFO級別偎巢,則應(yīng)用程序中所有DEBUG級別的日志信息將不被打印出來,也是說大于等于的級別的日志才輸出松嘶。
2 log4j2文件的配置大致結(jié)構(gòu)
? ? log4j2.xml文件的配置大致如下:
Configuration
? ? properties
? ? Appenders
? ? ? ? Console
? ? ? ? ? ? PatternLayout
? ? ? ? File
? ? ? ? RollingRandomAccessFile? ?
? ? ? ? ? ? Filters(過濾機(jī)制)
? ? ? ? ? ? PatternLayout(控制日志信息輸出格式)
? ? ? ? ? ? Polices(控制日志何時when滾動)
? ? ? ? ? ? Strategy(控制日志如何how滾動)
? ? Loggers
? ? ? ? AsyncLogger(異步日志器)
? ? ? ? ? ? AppenderRef
? ? ? ? Logger(同步日志器)
? ? ? ? ? ? AppenderRef
? ? ? ? RootLogger
? ? ? ? ? ? AppenderRef
? ? 2.1 Configuration
Configuration:為根節(jié)點(diǎn)艘狭,有status和monitorInterval等多個屬性
* status的值有 “trace”, “debug”, “info”, “warn”, “error” and “fatal”,用于控制log4j2日志框架本身的日志級別翠订,如果將stratus設(shè)置為較低的級別就會看到很多關(guān)于log4j2本身的日志,如加載log4j2配置文件的路徑等信息
* monitorInterval遵倦,含義是每隔多少秒重新讀取配置文件尽超,可以不重啟應(yīng)用的情況下修改配置
? ? 2.2 Appenders: 輸出源,用于定義日志輸出的地方梧躺,log4j2支持的輸出源有很多似谁,有控制臺Console傲绣、文件File、MongoDB巩踏、Flume秃诵、RollingRandomAccessFile等。
1. Console: 控制臺輸出源是將日志打印到控制臺上塞琼,開發(fā)的時候一般都會配置菠净,用于調(diào)試;
2. File:文件輸出源彪杉,用于將日志寫入到指定的文件毅往,需要配置輸入到哪個位置(如/data/applogs);
3. RollingRandomAccessFile: 該輸出源也是寫入到文件,不同的是不同的是比File更加強(qiáng)大派近,可以指定當(dāng)文件達(dá)到一定大信饰ā(如20MB)時,另起一個文件繼續(xù)寫入日志渴丸,另起一個文件就涉及到新文件的名字命名規(guī)則侯嘀,因此需要配置文件命名規(guī)則。這種方式更加實(shí)用谱轨,因?yàn)槟悴豢赡芤恢蓖粋€文件中寫残拐,如果一直寫,文件過大碟嘴,打開就會卡死溪食,也不便于查找日志。
* name: 日志器名
* fileName: 指定當(dāng)前日志文件的位置和名稱娜扇;
* filePattern: 指定當(dāng)發(fā)生Rolling時错沃,文件的轉(zhuǎn)移和重命名規(guī)則
* SizeBasedTriggeringPolicy: 指定當(dāng)文件體積大于size指定的值時,觸發(fā)Rolling雀瓢,生成一個新的日志文件;
* DefaultRolloverStrategy: 指定最多保存的文件個數(shù),默認(rèn)是9枢析;
* TimeBasedTriggeringPolicy: 與filePattern結(jié)合使用,比如filePattern="${LOG_HOME}/apibiz_%d{yyyyMMdd}.log”刃麸、TimeBasedTriggeringPolicy的interval=1醒叁,則表示每天生成一個文件,若filePattern改成{yyyyMMddHHmm}泊业,則每分鐘生成一個文件把沼;
? ?
? 2.4 Filters:可以配置一系列的過濾器
? ? Log4j2的onMatch和onMismatch屬性值詳解如下:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? onMatch和onMismatch都有三個屬性值,分別為Accept吁伺、DENY和NEUTRAL;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? 分別介紹這兩個配置項(xiàng)的三個屬性值:? ? ? ? ? ? ? ? ? ? ? -? ? ? ? ? ? ? ?
? ? --------------------? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? onMatch="ACCEPT" 表示匹配該級別及以上? ? ?
? ? onMatch="DENY" 表示不匹配該級別及以上? ? ? ? ?
? ? onMatch="NEUTRAL" 表示該級別及以上的饮睬,由下一個filter處理,如果當(dāng)前是最后一個篮奄,則表示匹配該級別及以上
? ? onMismatch="ACCEPT" 表示匹配該級別以下? ?
? ? onMismatch="NEUTRAL" 表示該級別及以下的捆愁,由下一個filter處理割去,如果當(dāng)前是最后一個,則不匹配該級別以下的
? ? onMismatch="DENY" 表示不匹配該級別以下的? ? ? ? ? ? ? -? ? ? ? ? ?
? ? --------------------
? 2.5 PatternLayout
* charset ##指定字符集?
* pattern ##指定格式
* alwaysWriteExceptions ##默認(rèn)為true昼丑,輸出異常
* header ##可選項(xiàng)呻逆。包含在每個日志文件的頂部
* footer ##可選項(xiàng)。包含在每個日志文件的尾部菩帝。
? ? ? ?
? 2.5.1 pattern屬性參數(shù)格式描述
######### 常見參數(shù) #########
%c{參數(shù)} 或 %logger{參數(shù)}? ##輸出日志名稱
%C{參數(shù)} 或 %class{參數(shù)? ? ##輸出類型
%d{參數(shù)}{時區(qū)te{參數(shù)}{時區(qū)} ##輸出時間
%F|%file? ? ? ? ? ? ? ? ? ##輸出文件名
highlight{pattern}{style} ##高亮顯示
%l? ##輸出錯誤的完整位置
%L? ##輸出錯誤行號
%m 或 %msg 或 %message ##輸出錯誤信息
%M 或 %method ##輸出方法名
%n? ? ? ? ? ? ##輸出換行符
%level{參數(shù)1}{參數(shù)2}{參數(shù)3} ##輸出日志的級別
%t 或 %thread? ? ? ? ? ? ? ##創(chuàng)建logging事件的線程名
*/
######### 特殊符號 ############
#有些特殊符號不能直接打印咖城,需要使用實(shí)體名稱或者編號
//
& —— & 或者 &
< —— <? 或者 <
> —— >? 或者 >
“ —— " 或者 "
‘ —— ' 或者 '
*/
######## pattern對齊修飾 ##########
// 對齊修飾,可以指定信息的輸出格式胁附,如是否左對齊酒繁,是否留空格等。
## 編寫格式為在任何pattern和%之間加入一個小數(shù)控妻,可以是正數(shù)州袒,也可以是負(fù)數(shù)。
## 整數(shù)表示右對齊弓候,負(fù)數(shù)表示左對齊郎哭;
## 整數(shù)位表示輸出信息的最小n個字符,如果輸出信息不夠n個字符菇存,將用空格補(bǔ)齊夸研;
## 小數(shù)位表示輸出信息的最大字符數(shù),如果超過n個字符依鸥,則只保留最后n個字符的信息
## (注意:保留的是后20個字符亥至,而不是前20個字符)
*/
#示例如下
%20 —— 右對齊,不足20個字符則在信息前面用空格補(bǔ)足贱迟,超過20個字符則保留原信息
%-20 —— 左對齊姐扮,不足20個字符則在信息后面用空格補(bǔ)足,超過20個字符則保留原信息
%.30 —— 如果信息超過30個字符衣吠,則只保留最后30個字符
%20.30 —— 右對齊茶敏,不足20個字符則在信息前面用空格補(bǔ)足,超過30個字符則只保留最后30個字符
%-20.30 —— 左對齊缚俏,不足20個字符則在信息后面用空格補(bǔ)足惊搏,超過30個字符則只保留最后30個字符
? ?
? ? 2.6 Loggers:日志器,分為跟日志器Root和自定義日志器自定義時需要指定每個Logger的名稱name(對于命名可以以包名作為日志的名字忧换,不同的包配置不同的級別等)恬惯,日志級別level,相加性additivity(是否繼承下面配置的日志器)包雀, 對于一般的日志器(如Console宿崭、File、RollingRandomAccessFile)一般需要配置一個或多個輸出源AppenderRef才写; 每個logger可以指定一個level(TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF)葡兑,不指定時level默認(rèn)為ERROR
additivity指定是否同時輸出log到父類的appender,缺省為true赞草。
log4j.xml配置樣例
<?xml version="1.0" encoding="UTF-8"?>
<!—日志框架本身的日志級別為warn,也就是說不會看到日志框架本身warn以下級別的日志信息-->
<configuration status="WARN">
? <Properties>
? ? ? <!—日志輸出格式讹堤,不足5個字符時左對齊,比對2.5中對pattern參數(shù)的解釋來看-->
? ? ? <Property name="PATTERN_LAYOUT">[search-mobile-web]%d %-5p [%c] %m%n</Property>
? ? ? <!—日志路徑-->
? ? ? <Property name="LOG_HOME">/data/applogs/search-mobile-web/</Property>
? </Properties>
? <appenders>
? ? ? <!—沒有filter厨疙,表示不過濾洲守,任何級別的日志都匹配-->
? ? ? <RollingRandomAccessFile
? ? ? ? ? ? name="rootAppender"
? ? ? ? ? ? fileName="${LOG_HOME}/root.log"
? ? ? ? ? ? filePattern="${LOG_HOME}/root_%d{yyyyMMdd}.log">
? ? ? ? <PatternLayout pattern="${PATTERN_LAYOUT}"/>
? ? ? ? <Policies>
? ? ? ? ? ? <TimeBasedTriggeringPolicy interval="1"/>
? ? ? ? </Policies>
? ? ? </RollingRandomAccessFile>
? ? ? <!—filePattern與TimeBasedTriggerPolicy共同決定了日志的滾動級別,filePattern格式?jīng)Q定滾動的時間沾凄、TimeBasedTriggerPolicy決定滾動間隔梗醇,比如當(dāng)前這個配置表示滾動時間為天級別、間隔為1天-->
? ? ? <RollingRandomAccessFile
? ? ? ? ? ? name="apiBizAppender"
? ? ? ? ? ? fileName="${LOG_HOME}/apibiz.log"
? ? ? ? ? filePattern="${LOG_HOME}/apibiz_%d{yyyyMMdd}.log”>
? ? ? ? <Filters>
? ? ? ? ? ? <!—表示不匹配warn級別及以上的撒蟀,warn級別以下由下一個? ? ? ? ? ? ? ? ? filter處理-->
? ? ? ? ? ? <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL”/>
? ? ? ? ? ? <!—表示匹配info級別及以上的叙谨,info級別以下不匹配-->
? ? ? ? ? ? <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
? ? ? ? </Filters>
? ? ? ? <PatternLayout pattern="${PATTERN_LAYOUT}"/>
? ? ? ? <Policies>
? ? ? ? ? ? <TimeBasedTriggeringPolicy interval="1"/>
? ? ? ? </Policies>
? ? ? </RollingRandomAccessFile>
? ? ? <RollingRandomAccessFile
? ? ? ? ? ? name="apiSysAppender"
? ? ? ? ? ? fileName="${LOG_HOME}/apisys.log"
? ? ? ? ? ? filePattern="${LOG_HOME}/apisys_%d{yyyyMMdd}.log">
? ? ? ? <Filters>
? ? ? ? ? ? <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
? ? ? ? ? ? <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
? ? ? ? </Filters>
? ? ? ? <PatternLayout pattern="${PATTERN_LAYOUT}"/>
? ? ? ? <Policies>
? ? ? ? ? ? <TimeBasedTriggeringPolicy interval="1"/>
? ? ? ? </Policies>
? ? ? </RollingRandomAccessFile>
? ? ? <RollingRandomAccessFile
? ? ? ? ? ? name="apiErrAppender"
? ? ? ? ? ? fileName="${LOG_HOME}/syserror.log"
? ? ? ? ? ? filePattern="${LOG_HOME}/syserror_%d{yyyyMMdd}.log">
? ? ? ? <Filters>
? ? ? ? ? ? <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
? ? ? ? </Filters>
? ? ? ? <PatternLayout pattern="${PATTERN_LAYOUT}"/>
? ? ? ? <Policies>
? ? ? ? ? ? <TimeBasedTriggeringPolicy interval="1"/>
? ? ? ? </Policies>
? ? ? </RollingRandomAccessFile>
? ? ? <RollingRandomAccessFile
? ? ? ? ? ? name="apiQueryAppender"
? ? ? ? ? ? fileName="${LOG_HOME}/query.log"
? ? ? ? ? ? filePattern="${LOG_HOME}/query_%d{yyyyMMdd}.log">
? ? ? ? <Filters>
? ? ? ? ? ? <ThresholdFilter level="warn" onMatch=“DENY" onMismatch="NEUTRAL"/>
? ? ? ? ? ? <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
? ? ? ? </Filters>
? ? ? ? <PatternLayout pattern="${PATTERN_LAYOUT}"/>
? ? ? ? <Policies>
? ? ? ? ? ? <TimeBasedTriggeringPolicy interval="1"/>
? ? ? ? </Policies>
? ? ? </RollingRandomAccessFile>
? ? ? <RollingRandomAccessFile
? ? ? ? ? ? name="serviceQueryAppender"
? ? ? ? ? ? fileName="${LOG_HOME}/servicelogs/query.log"
? ? ? ? ? ? filePattern="${LOG_HOME}/servicelogs/query.log_%d{yyyyMMdd}.log”>
? ? ? ? <!—表示僅匹配info級別-->
? ? ? ? <Filters>
? ? ? ? ? ? <ThresholdFilter level="warn" onMatch=“DENY" onMismatch="NEUTRAL"/>
? ? ? ? ? ? <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
? ? ? ? </Filters>
? ? ? ? <PatternLayout pattern="${PATTERN_LAYOUT}"/>
? ? ? ? <Policies>
? ? ? ? ? ? <TimeBasedTriggeringPolicy interval="1"/>
? ? ? ? </Policies>
? ? ? </RollingRandomAccessFile>
? ? ? <RollingRandomAccessFile
? ? ? ? ? ? name="serviceErrorAppender"
? ? ? ? ? ? fileName="${LOG_HOME}/servicelogs/error.log"
? ? ? ? ? ? filePattern="${LOG_HOME}/servicelogs/error.log_%d{yyyyMMdd}.log">
? ? ? ? <Filters>
? ? ? ? ? ? <ThresholdFilter level=“warn" onMatch="ACCEPT" onMismatch="DENY"/>
? ? ? ? </Filters>
? ? ? ? <PatternLayout pattern="${PATTERN_LAYOUT}"/>
? ? ? ? <Policies>
? ? ? ? ? ? <TimeBasedTriggeringPolicy interval="1"/>
? ? ? ? </Policies>
? ? ? </RollingRandomAccessFile>
? </appenders>
? <loggers>
? ? ? <AsyncLogger name="query-monitor" additivity="false" level="info">
? ? ? ? <appender-ref ref="serviceQueryAppender"/>
? ? ? </AsyncLogger>
? ? ? <AsyncLogger name="service-error-monitor" additivity="false" level="error">
? ? ? ? <appender-ref ref="serviceErrorAppender"/>
? ? ? </AsyncLogger>
? ? ? <AsyncLogger name="api-biz-monitor" additivity="false" level="warn">
? ? ? ? <appender-ref ref="apiBizAppender"/>
? ? ? </AsyncLogger>
? ? ? <AsyncLogger name="api-sys-monitor" additivity="false" level="warn">
? ? ? ? <appender-ref ref="apiSysAppender"/>
? ? ? </AsyncLogger>
? ? ? <AsyncLogger name="sys-error-monitor" additivity="false" level="error">
? ? ? ? <appender-ref ref="apiErrAppender"/>
? ? ? </AsyncLogger>
? ? ? <AsyncLogger name="query-monitor" additivity="false" level="info">
? ? ? ? <appender-ref ref="apiQueryAppender"/>
? ? ? </AsyncLogger>
? ? ? <asyncRoot level="info">
? ? ? ? <appender-ref ref="rootAppender"/>
? ? ? </asyncRoot>
? </loggers>
</configuration>
//按如上配置生產(chǎn)的日志格式樣例
相關(guān)jar包配置樣例
<!--log4j2依賴-start-->
<dependency>
? ? <groupId>org.apache.logging.log4j</groupId>
? ? <artifactId>log4j-api</artifactId>
? ? <version>${log4j2.version}</version>
</dependency>
<dependency>
? ? <groupId>org.apache.logging.log4j</groupId>
? ? <artifactId>log4j-core</artifactId>
? ? <version>${log4j2.version}</version>
</dependency>
<dependency>
? ? <groupId>org.apache.logging.log4j</groupId>
? ? <artifactId>log4j-slf4j-impl</artifactId>
? ? <version>${log4j2.version}</version>
</dependency>
<dependency>
? ? <groupId>org.apache.logging.log4j</groupId>
? ? <artifactId>log4j-web</artifactId>
? ? <version>${log4j2.version}</version>
</dependency>
<dependency>
? ? <groupId>org.slf4j</groupId>
? ? <artifactId>slf4j-api</artifactId>
? ? <version>${slf4j-api.version}</version>
</dependency>
<dependency>
? ? <groupId>com.lmax</groupId>
? ? <artifactId>disruptor</artifactId>
? ? <version>3.4.1</version>
</dependency>
<!--log4j2依賴-end-->