logback配置文件詳解

logback配置文件詳解

<?xml version="1.0" encoding="UTF-8"?>

<!-- 根節(jié)點(diǎn) , logback的全局配置 , 包含3個(gè)屬性

? ? scan : 當(dāng)文件發(fā)生變更時(shí)是否重載 , 默認(rèn)值ture

? ? scanPeriod : 監(jiān)測(cè)文件的間隔時(shí)間 , 即每隔多少時(shí)間掃描一次配置文件 僅當(dāng)scan=true時(shí)生效. 默認(rèn)間隔時(shí)間1min , 如果不寫單位默認(rèn)是毫秒;

? ? debug : 是否為debug模式 , 為true時(shí)會(huì)打印出logack內(nèi)部日志 , 便于查看logback實(shí)時(shí)信息 . 默認(rèn)值false

-->

<configuration scan="true" scanPeriod="60 seconds" debug="false">

? ? <!-- 上下文名稱 , 每個(gè)logger都關(guān)聯(lián)到上下文 , 默認(rèn)值為default . 設(shè)置之后不可動(dòng)態(tài)修改 -->

? ? <contextName>logback</contextName>

? ? <!-- 定義變量 , 在配置文件其他地方可通過${變量名}訪問 -->

? ? <property name="appName" value="xdemo"/>

? ? <!-- 內(nèi)部變量 , 獲取時(shí)間戳字符串 . key為變量名 , datePattern為解析的日期字符串格式 , 與SimpleDateFormat格式相同 -->

? ? <timestamp key="time" datePattern="yyyyMMdd HHmmss"/>

? ? <!-- 日志輸出組件 有兩個(gè)必須的屬性

? ? ? ? name : 當(dāng)前appender的名稱 , 在logger組件中相關(guān)聯(lián)

? ? ? ? class : 日志的輸出控制類 , 通過class將日志輸出到控制臺(tái)/文件/遠(yuǎn)程socket服務(wù)器/數(shù)據(jù)庫等

? ? ? ? ? ? 不同的class有著不同的配置

? ? -->

? ? <!-- ConsoleAppender , 將日志輸出到控制臺(tái) . 有encoder和target兩個(gè)子節(jié)點(diǎn)(新版本有filter子節(jié)點(diǎn) , 在下文中詳細(xì)說明) -->

? ? <appender name="console" class="ch.qos.logback.core.ConsoleAppender">

? ? ? ? <!-- 子節(jié)點(diǎn)encoder , 指定日志輸出的格式 , 具體格式配置見下方表格 -->

? ? ? ? <encoder>

? ? ? ? ? ? <pattern>%d{HH:mm:ss} [%thread][%X{traceId}] %-5level %logger{36} - %msg%n</pattern>

? ? ? ? </encoder>

? ? ? ? <!-- 子節(jié)點(diǎn)target , 日志輸出的對(duì)象 System.out 或 System.err -->

? ? ? ? <target></target>

? ? </appender>

? ? <!-- FileAppender , 將日志輸出到文件 . 有file/append/encoder/prudent四個(gè)子節(jié)點(diǎn)(新版本有filter子節(jié)點(diǎn) , 在下文中詳細(xì)說明) -->

? ? <appender name="file" class="ch.qos.logback.core.FileAppender">

? ? ? ? <!-- 子節(jié)點(diǎn)file , 輸出的目標(biāo)文件名 , 父級(jí)目錄不存在會(huì)自動(dòng)創(chuàng)建 . 無默認(rèn)值 -->

? ? ? ? <file>xdemo.log</file>

? ? ? ? <!-- 子節(jié)點(diǎn)append , 是否為追加模式 . 為true則日志被追加到文件末尾 , false則清空現(xiàn)文件重新寫入 . 默認(rèn)值true -->

? ? ? ? <append>true</append>

? ? ? ? <!-- 子節(jié)點(diǎn)encoder , 指定日志輸出的格式 -->

? ? ? ? <encoder>

? ? ? ? ? ? <pattern>%d{HH:mm:ss} [%thread][%X{traceId}] %-5level %logger{36} - %msg%n</pattern>

? ? ? ? </encoder>

? ? ? ? <!-- 子節(jié)點(diǎn)produent , 是否為安全寫入模式 . 為ture則日志會(huì)被安全的寫入文件 , 即使其他FileAppender同時(shí)做寫入操作 , 效率低 . 默認(rèn)值false -->

? ? ? ? <prudent>true</prudent>

? ? </appender>

? ? <!-- RollingFileAppender , 將日志動(dòng)態(tài)輸出到文件 . 通過clas指定策略 ,? 符合某個(gè)策略時(shí) , 會(huì)自動(dòng)創(chuàng)建新日志文件并輸出(按日期/大小等) . 有file/append/rollingPolicy等幾個(gè)節(jié)點(diǎn) -->

? ? <!-- RollingFileAppender詳細(xì)配置參見下文 -->

? ? <!-- logger 日志返回/級(jí)別及輸出目標(biāo)配置 有必填屬性name和選填屬性level/additivity , 一個(gè)appender-ref 子節(jié)點(diǎn)(可配置1個(gè)或多個(gè))

? ? ? ? name : 指定遵守該logger約束的一個(gè)包或具體的某個(gè)類

? ? ? ? level : 日志級(jí)別 ,有以下值TRACE, DEBUG, INFO, WARN, ERROR, ALL, OFF , 不區(qū)分大小寫

? ? ? ? additivity : 是否向上級(jí)logger傳遞日志信息 , 默認(rèn)為ture . (如果上級(jí)logger也輸出日志 , 則會(huì)輸出兩份 . 所以通常情況下配置為false)

? ? -->

? ? <logger name="org.springframework" level="INFO" additivity="false">

? ? ? ? <appender-ref ref="console"/><!-- 輸出到相關(guān)聯(lián)的appender中 -->

? ? ? ? <appender-ref ref="file"/>

? ? </logger>

? ? <!-- 更多常用的三方框架logger配置見下文 -->

? ? <!-- root本身也是一個(gè)logger節(jié)點(diǎn)(相當(dāng)于name="root"的logger) , 但僅能配置一個(gè) , 是所有l(wèi)ogger的父級(jí)(可以理解為Java中的Object) , 只有一個(gè)level屬性, 默認(rèn)值DEBUG -->

? ? <root level="error">

? ? ? ? <appender-ref ref="console"/>

? ? ? ? <appender-ref ref="file" />

? ? </root>

</configuration>

?RollingFileAppender詳細(xì)配置

<!-- RollingFileAppender詳細(xì)配置

? ? 其中有file/append/pruduent幾個(gè)通用節(jié)點(diǎn) , 不再詳述 .

? ? 具體講一下rollingPolicy節(jié)點(diǎn)相關(guān) , 該節(jié)點(diǎn)通過class屬性指定不同的配置指定RoolingFileAppender的動(dòng)態(tài)行為 , 涉及日志文件的移動(dòng)/重命名等

-->

<!-- TimeBasedRollingPolicy 最常用的動(dòng)態(tài)策略 , 根據(jù)時(shí)間來分割日志 主要有fileNamePattern和maxHistory子節(jié)點(diǎn) -->

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

? ? <!-- 子節(jié)點(diǎn)fileNamePattern : 文件目錄表達(dá)式 , 包含文件名及%d轉(zhuǎn)換表達(dá)式 , %d可以包含一個(gè)SimpleDateFormat格式的日期字符串 , 如"yyyyMMdd" , 如省略直接寫%d則默認(rèn)為"yyy-MM-dd", 則按照日期自動(dòng)分割每天產(chǎn)生的日志

配置該節(jié)點(diǎn)后 , RollingFileAppender的file節(jié)點(diǎn)可有可無 , 如果同時(shí)配置了兩個(gè)節(jié)點(diǎn)的話 , 日志文件會(huì)歸檔為兩套(一套按日期分割 , 一套整個(gè)寫入file指定的文件) -->

? ? <fileNamePattern>/data/logs/%d/xdemo_%d{yyMMdd}.log</fileNamePattern>

? ? <!-- 子節(jié)點(diǎn)maxHistory : 非必填節(jié)點(diǎn) , 控制歷史歸檔的最大數(shù)量 , 超出該配置則刪除舊文件 . 如果配置按天歸檔且maxHistory為30 , 則只保存最近30天的日志文件(包括為該文件而創(chuàng)建的目錄) -->

? ? <maxHistory>30</maxHistory>

? ? <!-- 子節(jié)點(diǎn)totalSizeCap , 在 1.1.6版本后才開始支持, 配置總?cè)罩疚募拇笮∩舷?-->

? ? <totalSizeCap>20GB</totalSizeCap>

</rollingPolicy>

<!-- SizeBasedTriggeringProlicy 根據(jù)大小來分割日志 , 只有一個(gè)專屬子節(jié)點(diǎn)maxFileSize -->

<rollingPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">

? ? <file>/data/logs/xdemo.log</file>

? ? <!-- 單個(gè)日志的大小上限 , 超出該上線則新建日志(后綴名_1/2/3)繼續(xù)寫入 -->

? ? <maxFileSize>500MB</maxFileSize>

</rollingPolicy>

<!-- SizeAndTimeBasedRollingPolicy 綜合時(shí)間和大小分割 , 單個(gè)時(shí)間段內(nèi)超過大小繼續(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詳細(xì)配置

<!-- filter: 日志過濾器 , 可以過濾不符合規(guī)則的內(nèi)容 , 使之不輸出到控制臺(tái)或文件 , 為appender的子節(jié)點(diǎn)

? ? logback過濾器是基于Ternary Logic, 允許多個(gè)過濾器搭配使用 , 配置多個(gè)過濾器時(shí)按照書寫順序依次執(zhí)行

? ? 執(zhí)行一個(gè)過濾器會(huì)返回以下幾個(gè)枚舉值

? ? ? ? ACCEPT: 該日志符合規(guī)則 , 接受處理 . 同時(shí)不會(huì)再經(jīng)過其他過濾器

? ? ? ? NEUTRAL: 當(dāng)前過濾器不處理 , 下個(gè)過濾器繼續(xù)處理

? ? ? ? DENY: 該日志將被過濾拋棄 , 且不再經(jīng)過其他過濾器

-->

<appender name="logFile" class="ch.qos.logback.core.rolling.RollingFileAppender">

? ? <!-- ...其他配置略... -->

? ? <!-- LevelFilter: 級(jí)別過濾器; 過濾掉非配置等級(jí)的日志 , 只有等于當(dāng)前級(jí)別時(shí)才會(huì)處理 -->

? ? <filter class="ch.qos.logback.classic.filter.LevelFilter">

? ? ? ? <level>INFO</level>

? ? ? ? <onMatch>ACCEPT</onMatch><!-- 匹配等級(jí)的返回值 -->

? ? ? ? <onMismatch>DENY</onMismatch><!-- 不匹配的返回值 -->

? ? </filter>

? ? <!-- ThresholdFilter: 閥值過濾器; 過濾掉低于閥值的日志 , 當(dāng)日志級(jí)別等于或高于閥值 , 過濾器返回NEUTRAL , 否則直接返回DENY -->

? ? <filter class="ch.qos.logback.classic.filter.ThresholdFilter">

? ? ? ? <level>INFO</level>

? ? </filter>

? ? <!-- EvaluatorFilter: 條件過濾器; 評(píng)估鑒別日志是否符合指定條件 , 有一個(gè)主要的evaluator(鑒定器)子節(jié)點(diǎn) -->

? ? <filter class="ch.qos.logback.core.filter.EvaluatorFilter">

? ? ? ? <!-- 過濾器 -->

? ? ? ? <evaluator> <!-- 默認(rèn)為 ch.qos.logback.classic.boolex.JaninoEventEvaluator -->

? ? ? ? ? ? <expression>return message.contains("xinfo");</expression><!-- 布爾表達(dá)式 , 還有一種正則表達(dá)式的形式 -->

? ? ? ? </evaluator>

? ? ? ? <OnMatch>ACCEPT</OnMatch>

? ? ? ? <OnMismatch>DENY</OnMismatch>

? ? </filter>

</appender>

日志輸出格式詳細(xì)說明

參數(shù) 說明 示例

c{length}

lo{legnth}

logger{length}

輸出日志的logger , length縮短logger名 , 設(shè)置為0表示只輸入logger最右邊點(diǎn)符號(hào)之后內(nèi)容(從右開始縮短 ,每個(gè)層級(jí)至少保留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}

輸出當(dāng)前調(diào)用者的全名(包名+類名) , 參數(shù)與上面一致 , 效率不高 , 盡量避免使用 %class

contextName

cn

輸出xml中配置的上下文名稱 %contextName

d{pattern}

date{pattern}

輸出當(dāng)前的時(shí)間 , 字符串語法與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

輸出日志寫入目標(biāo)的文件名 , 盡量避免使用 %file

caller{depth}

caller{depth, evaluator-1, ... evaluator-n}

當(dāng)前調(diào)用者的位置信息 ?

L

line

輸出日期請(qǐng)求的行號(hào) , 盡量避免使用 %line

m

msg

message

輸出日志信息(必用) %message

M

method

當(dāng)前執(zhí)行日志請(qǐng)求的方法名 , 盡量避免使用 %method

n 輸出平臺(tái)相關(guān)的換行符("\n" 或 "\r\n") %n

p

le

level

輸出日志級(jí)別(TRACE/DEBUG/INFO/WARN/ERROR/FATAL) %level

r

relative

輸出自程序啟動(dòng)到創(chuàng)建日志記錄的時(shí)間 , 單位毫秒 %relative

t

thread

輸出調(diào)用日志的線程名 %thread

replace(p){r,t} 替換輸出內(nèi)容 , p為日志內(nèi)容 , r是正則表達(dá)式 , 將p中符合r的內(nèi)容替換為t %replace(%msg){'\s',''}

日志格式修飾符

可選的格式修飾符位于“%”和轉(zhuǎn)換符之間。(%-5level / %.6logger)

第一個(gè)可選修飾符是左對(duì)齊?標(biāo)志,符號(hào)是減號(hào)“-”;接著是可選的最小寬度?修飾符,用十進(jìn)制數(shù)表示。如果字符小于最小寬度,則左填充或右填充,默認(rèn)是左填充(即右對(duì)齊),填充符為空格。如果字符大于最小寬度,字符永遠(yuǎn)不會(huì)被截?cái)?。最大寬?修飾符,符號(hào)是點(diǎn)號(hào)"."后面加十進(jìn)制數(shù)。如果字符大于最大寬度,則從前面截?cái)唷|c(diǎn)符號(hào)“.”后面加減號(hào)“-”在加數(shù)字,表示從尾部截?cái)唷?/p>

例如:%-4relative 表示,將輸出從程序啟動(dòng)到創(chuàng)建日志記錄的時(shí)間 進(jìn)行左對(duì)齊 且最小寬度為4

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容