logback配置文件詳解
<?xml version="1.0" encoding="UTF-8"?>
<!-- 根節(jié)點 , logback的全局配置 , 包含3個屬性
? ? scan : 當文件發(fā)生變更時是否重載 , 默認值ture
? ? scanPeriod : 監(jiān)測文件的間隔時間 , 即每隔多少時間掃描一次配置文件 僅當scan=true時生效. 默認間隔時間1min , 如果不寫單位默認是毫秒;
? ? debug : 是否為debug模式 , 為true時會打印出logack內部日志 , 便于查看logback實時信息 . 默認值false
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
? ? <!-- 上下文名稱 , 每個logger都關聯(lián)到上下文 , 默認值為default . 設置之后不可動態(tài)修改 -->
? ? <contextName>logback</contextName>
? ? <!-- 定義變量 , 在配置文件其他地方可通過${變量名}訪問 -->
? ? <property name="appName" value="xdemo"/>
? ? <!-- 內部變量 , 獲取時間戳字符串 . key為變量名 , datePattern為解析的日期字符串格式 , 與SimpleDateFormat格式相同 -->
? ? <timestamp key="time" datePattern="yyyyMMdd HHmmss"/>
? ? <!-- 日志輸出組件 有兩個必須的屬性
? ? ? ? name : 當前appender的名稱 , 在logger組件中相關聯(lián)
? ? ? ? class : 日志的輸出控制類 , 通過class將日志輸出到控制臺/文件/遠程socket服務器/數(shù)據(jù)庫等
? ? ? ? ? ? 不同的class有著不同的配置
? ? -->
? ? <!-- ConsoleAppender , 將日志輸出到控制臺 . 有encoder和target兩個子節(jié)點(新版本有filter子節(jié)點 , 在下文中詳細說明) -->
? ? <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
? ? ? ? <!-- 子節(jié)點encoder , 指定日志輸出的格式 , 具體格式配置見下方表格 -->
? ? ? ? <encoder>
? ? ? ? ? ? <pattern>%d{HH:mm:ss} [%thread][%X{traceId}] %-5level %logger{36} - %msg%n</pattern>
? ? ? ? </encoder>
? ? ? ? <!-- 子節(jié)點target , 日志輸出的對象 System.out 或 System.err -->
? ? ? ? <target></target>
? ? </appender>
? ? <!-- FileAppender , 將日志輸出到文件 . 有file/append/encoder/prudent四個子節(jié)點(新版本有filter子節(jié)點 , 在下文中詳細說明) -->
? ? <appender name="file" class="ch.qos.logback.core.FileAppender">
? ? ? ? <!-- 子節(jié)點file , 輸出的目標文件名 , 父級目錄不存在會自動創(chuàng)建 . 無默認值 -->
? ? ? ? <file>xdemo.log</file>
? ? ? ? <!-- 子節(jié)點append , 是否為追加模式 . 為true則日志被追加到文件末尾 , false則清空現(xiàn)文件重新寫入 . 默認值true -->
? ? ? ? <append>true</append>
? ? ? ? <!-- 子節(jié)點encoder , 指定日志輸出的格式 -->
? ? ? ? <encoder>
? ? ? ? ? ? <pattern>%d{HH:mm:ss} [%thread][%X{traceId}] %-5level %logger{36} - %msg%n</pattern>
? ? ? ? </encoder>
? ? ? ? <!-- 子節(jié)點produent , 是否為安全寫入模式 . 為ture則日志會被安全的寫入文件 , 即使其他FileAppender同時做寫入操作 , 效率低 . 默認值false -->
? ? ? ? <prudent>true</prudent>
? ? </appender>
? ? <!-- RollingFileAppender , 將日志動態(tài)輸出到文件 . 通過clas指定策略 ,? 符合某個策略時 , 會自動創(chuàng)建新日志文件并輸出(按日期/大小等) . 有file/append/rollingPolicy等幾個節(jié)點 -->
? ? <!-- RollingFileAppender詳細配置參見下文 -->
? ? <!-- logger 日志返回/級別及輸出目標配置 有必填屬性name和選填屬性level/additivity , 一個appender-ref 子節(jié)點(可配置1個或多個)
? ? ? ? name : 指定遵守該logger約束的一個包或具體的某個類
? ? ? ? level : 日志級別 ,有以下值TRACE, DEBUG, INFO, WARN, ERROR, ALL, OFF , 不區(qū)分大小寫
? ? ? ? additivity : 是否向上級logger傳遞日志信息 , 默認為ture . (如果上級logger也輸出日志 , 則會輸出兩份 . 所以通常情況下配置為false)
? ? -->
? ? <logger name="org.springframework" level="INFO" additivity="false">
? ? ? ? <appender-ref ref="console"/><!-- 輸出到相關聯(lián)的appender中 -->
? ? ? ? <appender-ref ref="file"/>
? ? </logger>
? ? <!-- 更多常用的三方框架logger配置見下文 -->
? ? <!-- root本身也是一個logger節(jié)點(相當于name="root"的logger) , 但僅能配置一個 , 是所有l(wèi)ogger的父級(可以理解為Java中的Object) , 只有一個level屬性, 默認值DEBUG -->
? ? <root level="error">
? ? ? ? <appender-ref ref="console"/>
? ? ? ? <appender-ref ref="file" />
? ? </root>
</configuration>
?RollingFileAppender詳細配置
<!-- RollingFileAppender詳細配置
? ? 其中有file/append/pruduent幾個通用節(jié)點 , 不再詳述 .
? ? 具體講一下rollingPolicy節(jié)點相關 , 該節(jié)點通過class屬性指定不同的配置指定RoolingFileAppender的動態(tài)行為 , 涉及日志文件的移動/重命名等
-->
<!-- TimeBasedRollingPolicy 最常用的動態(tài)策略 , 根據(jù)時間來分割日志 主要有fileNamePattern和maxHistory子節(jié)點 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
? ? <!-- 子節(jié)點fileNamePattern : 文件目錄表達式 , 包含文件名及%d轉換表達式 , %d可以包含一個SimpleDateFormat格式的日期字符串 , 如"yyyyMMdd" , 如省略直接寫%d則默認為"yyy-MM-dd", 則按照日期自動分割每天產(chǎn)生的日志
配置該節(jié)點后 , RollingFileAppender的file節(jié)點可有可無 , 如果同時配置了兩個節(jié)點的話 , 日志文件會歸檔為兩套(一套按日期分割 , 一套整個寫入file指定的文件) -->
? ? <fileNamePattern>/data/logs/%d/xdemo_%d{yyMMdd}.log</fileNamePattern>
? ? <!-- 子節(jié)點maxHistory : 非必填節(jié)點 , 控制歷史歸檔的最大數(shù)量 , 超出該配置則刪除舊文件 . 如果配置按天歸檔且maxHistory為30 , 則只保存最近30天的日志文件(包括為該文件而創(chuàng)建的目錄) -->
? ? <maxHistory>30</maxHistory>
? ? <!-- 子節(jié)點totalSizeCap , 在 1.1.6版本后才開始支持, 配置總日志文件的大小上限 -->
? ? <totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<!-- SizeBasedTriggeringProlicy 根據(jù)大小來分割日志 , 只有一個專屬子節(jié)點maxFileSize -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
? ? <file>/data/logs/xdemo.log</file>
? ? <!-- 單個日志的大小上限 , 超出該上線則新建日志(后綴名_1/2/3)繼續(xù)寫入 -->
? ? <maxFileSize>500MB</maxFileSize>
</rollingPolicy>
<!-- SizeAndTimeBasedRollingPolicy 綜合時間和大小分割 , 單個時間段內超過大小繼續(xù)分割 -->
<!-- ?FixedWindowRollingPolicy 根據(jù)固定窗口算法分割文件? -->
?常用的三方框架logger配置
<!-- 常用的三方框架logger配置 -->
<!-- myBatis/JDBC 日志 -->
<logger name="com.apache.ibatis" level="DEBUG"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- hibernate日志 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="DEBUG" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
filter詳細配置
<!-- filter: 日志過濾器 , 可以過濾不符合規(guī)則的內容 , 使之不輸出到控制臺或文件 , 為appender的子節(jié)點
? ? logback過濾器是基于Ternary Logic, 允許多個過濾器搭配使用 , 配置多個過濾器時按照書寫順序依次執(zhí)行
? ? 執(zhí)行一個過濾器會返回以下幾個枚舉值
? ? ? ? ACCEPT: 該日志符合規(guī)則 , 接受處理 . 同時不會再經(jīng)過其他過濾器
? ? ? ? NEUTRAL: 當前過濾器不處理 , 下個過濾器繼續(xù)處理
? ? ? ? DENY: 該日志將被過濾拋棄 , 且不再經(jīng)過其他過濾器
-->
<appender name="logFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
? ? <!-- ...其他配置略... -->
? ? <!-- LevelFilter: 級別過濾器; 過濾掉非配置等級的日志 , 只有等于當前級別時才會處理 -->
? ? <filter class="ch.qos.logback.classic.filter.LevelFilter">
? ? ? ? <level>INFO</level>
? ? ? ? <onMatch>ACCEPT</onMatch><!-- 匹配等級的返回值 -->
? ? ? ? <onMismatch>DENY</onMismatch><!-- 不匹配的返回值 -->
? ? </filter>
? ? <!-- ThresholdFilter: 閥值過濾器; 過濾掉低于閥值的日志 , 當日志級別等于或高于閥值 , 過濾器返回NEUTRAL , 否則直接返回DENY -->
? ? <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
? ? ? ? <level>INFO</level>
? ? </filter>
? ? <!-- EvaluatorFilter: 條件過濾器; 評估鑒別日志是否符合指定條件 , 有一個主要的evaluator(鑒定器)子節(jié)點 -->
? ? <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
? ? ? ? <!-- 過濾器 -->
? ? ? ? <evaluator> <!-- 默認為 ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
? ? ? ? ? ? <expression>return message.contains("xinfo");</expression><!-- 布爾表達式 , 還有一種正則表達式的形式 -->
? ? ? ? </evaluator>
? ? ? ? <OnMatch>ACCEPT</OnMatch>
? ? ? ? <OnMismatch>DENY</OnMismatch>
? ? </filter>
</appender>
日志輸出格式詳細說明
參數(shù) 說明 示例
c{length}
lo{legnth}
logger{length}
輸出日志的logger , length縮短logger名 , 設置為0表示只輸入logger最右邊點符號之后內容(從右開始縮短 ,每個層級至少保留1位)
完整logger名 : cn.xbz.test.HelloController
%logger :?cn.xbz.test.HelloController
%logger{0}: HelloController
%logger{5}: c.x.t.HelloController
%logger{20}: c.x.test.HelloController
C{length}
class{length}
輸出當前調用者的全名(包名+類名) , 參數(shù)與上面一致 , 效率不高 , 盡量避免使用 %class
contextName
cn
輸出xml中配置的上下文名稱 %contextName
d{pattern}
date{pattern}
輸出當前的時間 , 字符串語法與SimpleDateFormat相同
%d : 2019-01-10 10:01:10,816
%date : 2019-01-10 10:01:10,816
%date{HH:mm:ss.SSS} :?10:01:10,816
%date{yyyy-MM-dd hh:mm:ss} :?2019-01-10 10:01:10?
F
file
輸出日志寫入目標的文件名 , 盡量避免使用 %file
caller{depth}
caller{depth, evaluator-1, ... evaluator-n}
當前調用者的位置信息 ?
L
line
輸出日期請求的行號 , 盡量避免使用 %line
m
msg
message
輸出日志信息(必用) %message
M
method
當前執(zhí)行日志請求的方法名 , 盡量避免使用 %method
n 輸出平臺相關的換行符("\n" 或 "\r\n") %n
p
le
level
輸出日志級別(TRACE/DEBUG/INFO/WARN/ERROR/FATAL) %level
r
relative
輸出自程序啟動到創(chuàng)建日志記錄的時間 , 單位毫秒 %relative
t
thread
輸出調用日志的線程名 %thread
replace(p){r,t} 替換輸出內容 , p為日志內容 , r是正則表達式 , 將p中符合r的內容替換為t %replace(%msg){'\s',''}
日志格式修飾符
可選的格式修飾符位于“%”和轉換符之間。(%-5level / %.6logger)
第一個可選修飾符是左對齊?標志散怖,符號是減號“-”肄渗;接著是可選的最小寬度?修飾符,用十進制數(shù)表示翎嫡。如果字符小于最小寬度,則左填充或右填充具伍,默認是左填充(即右對齊)圈驼,填充符為空格。如果字符大于最小寬度绩脆,字符永遠不會被截斷橄抹。最大寬度?修飾符惕味,符號是點號"."后面加十進制數(shù)。如果字符大于最大寬度名挥,則從前面截斷。點符號“.”后面加減號“-”在加數(shù)字榄融,表示從尾部截斷救湖。
例如:%-4relative 表示,將輸出從程序啟動到創(chuàng)建日志記錄的時間 進行左對齊 且最小寬度為4