一 logback簡介
? ? ??Logback是一個開源日志組件。Logback一般和SLF4結(jié)合起來使用。外層使用SLF4J,里面的實現(xiàn)是logback。什么意思,簡單來說我們使用層看到的是SLF4J。我們使用的時候就是和SLF4J提供的一些api打交道。
? ? ??我們可能經(jīng)常聽到SLF4J,logback,log4j,logging這些個名詞。下面我們用一個簡單的圖來解釋下他們之間的關(guān)系之間的關(guān)系。我們用一個圖來表述他們之間的關(guān)系。
- SLF4J: Simple Logging Facade for Java 簡單日志門面,不是具體的日志解決方案,它只服務(wù)于各種各樣的日志系統(tǒng)。換句話說SLF4J只是一個日志標準(按照我們程序員的思維,我們可以把它認為是接口)。并不是日志系統(tǒng)的具體實現(xiàn)。如果項目只有slf4j的包是沒辦法實現(xiàn)日志功能的,需要配合其他的實現(xiàn)框架比如logback,logback,log4j,logging等。
- Logback:logback框架完全按照slf4j的規(guī)范開發(fā)。是日志的具體實現(xiàn)框架。
- log4j:log4j不是按照slf4j標準來開發(fā)的,所以log4j需要一個中間適配器。
- logging: logging是jdk提供的一個日志框架,也不是按照slf4j標準來的,所以也需要一個總結(jié)適配器。才能兼容slf4j。
因為logback的使用不需要適配器,講道理logback比其他需要中間適配器的日志框架要快。
二 logback配置文件
? ? ??logback使用最關(guān)鍵在配置文件的使用。因為在logbakc(包括其他的日志框架)的使用過程中,有很大一部分工作都是在配置文件上做文章的,比如需要輸出什么級別的日志,日志文件怎么歸檔,打印日志文件的時候需要打印哪些信息等等。這些個東西都是通過logback的配置文件來定義的。
? ? ??logback的配置文件是一個xml格式的文件logback-test.xml或者logback.xml,讀取配置文件的步驟:
- (1)嘗試classpath下查找文件logback-test.xml
- (2)如果文件不存在,嘗試查找logback.xml
- (3)如果兩個文件都不存在,LogBack用BasicConfiguration自動對自己進行最小化配置,這樣既實現(xiàn)了上面我們不需要添加任何配置就可以輸出到控制臺日志信息。
? ? ??logback配置文件是一個xml文件,根節(jié)點是configuration標簽。如下就是一個完成的logback配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<!--
說明:
1、日志級別及文件
日志記錄采用分級記錄,級別與日志文件名相對應(yīng),不同級別的日志信息記錄到不同的日志文件中
例如:error級別記錄到xxx-error-xxx.log(該文件為當前記錄的日志文件),而xxx-error-xxx.x.log為歸檔日志,
日志文件按日期記錄,同一天內(nèi),若日志文件大小等于或大于2M,則按0、1、2...順序分別命名
例如xxx-error-2013-12-21.0.log
其它級別的日志也是如此。
2、文件路徑
若本地開發(fā),以絕對路徑指定,如:/Users/zhangboqing/Downloads/logs。
若部署到服務(wù)器,則各個服務(wù)器約定一個固定的日志路徑如/data/home/logs/【項目名】/
3、Appender
FILE-ALL對應(yīng)所有級別,文件名以xxx-all-xxx.log形式命名
FILE-ERROR對應(yīng)error級別,文件名以xxx-error-xxx.log形式命名
FILE-WARN對應(yīng)warn級別,文件名以xxx-warn-xxx.log形式命名
FILE-INFO對應(yīng)info級別,文件名以xxx-info-xxx.log形式命名
FILE-DEBUG對應(yīng)debug級別,文件名以xxx-debug-xxx.log形式命名
STDOUT將日志信息輸出到控制上,為方便開發(fā)測試使用
-->
<!--
根節(jié)點<configuration>,包含下面三個屬性
1.scan: 當此屬性設(shè)置為true時,配置文件如果發(fā)生改變,將會被重新加載,默認值為true。
2.scanPeriod: 設(shè)置監(jiān)測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。
3.debug: 當此屬性設(shè)置為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài)。默認值為false。
-->
<configuration scan="true" scanPeriod="10 seconds">
<!--
子節(jié)點<property name="" value=""> :用來定義變量值,它有兩個屬性name和value,通過<property>定義的值會被插入到logger上下文中,可以使“${}”來使用變量。
-->
<!--
子節(jié)點<property resource=""/> :用來引入外部屬性文件,可以使“${}”來使用變量。
-->
<property name="APP_NAME" value="IoServer4J"/>
<property name="LOG_DIR" value="./logs/${APP_NAME}"/>
<property name="LOG_FILE_NAME" value="sys"/>
<property name="ERROR_LOG_FILE_NAME" value="error"/>
<property name="DB_LOG_FILE_NAME" value="db"/>
<property name="logFileNamePattern" value="${LOG_FILE_NAME}_%d{yyyy-MM-dd}_%i"/>
<property name="errorLogFileNamePattern" value="${ERROR_LOG_FILE_NAME}_%d{yyyy-MM-dd}_%i"/>
<property name="dbLogFileNamePattern" value="${DB_LOG_FILE_NAME}_%d{yyyy-MM-dd}_%i"/>
<!-- 注冊轉(zhuǎn)換器,顏色轉(zhuǎn)化器 -->
<!-- 彩色日志依賴的渲染類 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 日志輸出格式 -->
<!--
日志輸出格式:
%d: 表示日期時間,
%5p: 級別從左顯示5個字符寬度,
${PID:- }: pid
%15.20t: 線程名字(如果寬度不足15,左側(cè)補空白;如果寬度超過20,從左側(cè)截斷)
%logger{50}: 表示logger名字最長50個字符,否則按照句點分割
%%-4L: 行號,保留后面四位字符寬度
%m: 日志消息
%n: 換行符
${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}:
-->
<property name="consoleLayoutPattern"
value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.20t]){faint} %clr(%-40.40logger{60} Line:%-4L){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<property name="fileLayoutPattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:- } --- [%15.20t] %-40.40logger{60} Line:%-4L : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<!--
子節(jié)點<contextName>:用來設(shè)置上下文名稱,每個logger都關(guān)聯(lián)到logger上下文,默認上下文名稱為default。但可以使用<contextName>設(shè)置成其他名字,用于區(qū)分不同應(yīng)用程序的記錄。一旦設(shè)置,不能修改。
-->
<contextName>${APP_NAME}</contextName>
<!--
子節(jié)點<appender>:負責(zé)寫日志的組件,它有兩個必要屬性name和class。name指定appender名稱,class指定appender的全限定名
class為ch.qos.logback.core.ConsoleAppender 把日志輸出到控制臺
class為ch.qos.logback.core.FileAppender 把日志添加到文件
class為ch.qos.logback.core.rolling.RollingFileAppender 滾動記錄文件,先將日志記錄到指定文件,當符合某個條件時,將日志記錄到其他文件
-->
<!-- 控制臺輸出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<pattern>${consoleLayoutPattern}</pattern>
</encoder>
</appender>
<appender name="SYS_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/${LOG_FILE_NAME}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/${logFileNamePattern}.log.zip
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<pattern>${fileLayoutPattern}</pattern>
</encoder>
</appender>
<appender name="ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/${ERROR_LOG_FILE_NAME}.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/${errorLogFileNamePattern}.log.zip
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory><!-- days -->
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<pattern>${fileLayoutPattern}</pattern>
</encoder>
</appender>
<appender name="DB_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/${DB_LOG_FILE_NAME}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/${dbLogFileNamePattern}.log.zip
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory><!-- days -->
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<pattern>${fileLayoutPattern}</pattern>
</encoder>
</appender>
<!--
子節(jié)點<logger>:用來設(shè)置某一個包或者具體的某一個類的日志打印級別,以及指定<appender>,
logger 僅有一個name屬性,兩個可選屬性 level/additivity
name:用來指定受此logger約束的某一個包或者具體的某一個類。
level:用來設(shè)置打印級別,大小寫無關(guān),TRACE,DEBUG,INFO,WARE,ERROR,ALL和OFF,還有一個特俗值INHERITED
或者 同義詞NULL,代表強制執(zhí)行上級的級別。
additivity:是否向上級logger傳遞打印信息。默認是true。
-->
<!-- db/sql logger -->
<logger name="java.sql.Connection" level="warn" additivity="true">
<appender-ref ref="DB_LOG"/>
</logger>
<logger name="java.sql.PreparedStatement" level="warn" additivity="true">
<appender-ref ref="DB_LOG"/>
</logger>
<logger name="java.sql.Statement" level="warn" additivity="true">
<appender-ref ref="DB_LOG"/>
</logger>
<!-- sql -->
<logger name="com.pilot.ioserver.basic.biz.pbl.core.db.mapper" level="warn" additivity="true">
<appender-ref ref="DB_LOG"/>
</logger>
<!-- 生產(chǎn)環(huán)境下,將此級別配置為適合的級別,以免日志文件太多或影響程序性能 -->
<!--
<root>元素也是<logger>元素,logger。只有一個level屬性。
root 元素配置根 logger。該元素有一個 level 屬性。沒有 name 屬性,因為已經(jīng)被命名為“root”
<root>可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個logger。
-->
<root level="warn">
<!-- 控制臺輸出 -->
<appender-ref ref="CONSOLE"/>
<!-- 文件輸出 -->
<appender-ref ref="SYS_LOG"/>
<!-- 錯誤日志 -->
<appender-ref ref="ERROR_LOG"/>
</root>
</configuration>
2.1 configuration
? ? ??configuration標簽是logback文件的根目錄。
2.1.1 configuration屬性
configuration屬性 | 默認值 | 解釋 |
---|---|---|
scan | true | 當設(shè)置為true時,如果配置文件發(fā)生改變,將會被重新加載 |
scanPeriod | 1分鐘 | 默認單位是毫秒,當scan為true時,此屬性生效。作用:檢測配置文件是否有修改時間間隔 |
debug | false | 當此屬性為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài) |
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--其他配置省略-->
</configuration>
? ? ??上述配置代碼每隔60毫秒會檢查logback配置文件是否有修改,如果有修改就重寫加載。并且不會輸出logback的內(nèi)部日志。
2.1.2 configuration子節(jié)點
configuration子節(jié)點 | 含義 |
---|---|
contextName | 設(shè)置日志上下文名稱,后面輸出格式中可以通過定義 %contextName 來打印日志上下文名稱 |
property | 用來設(shè)置相關(guān)變量,通過key-value的方式配置,然后在后面的配置文件中通過 ${key}來訪問 |
timestamp | 用于獲取時間戳字符串 |
conversionRule | 注冊轉(zhuǎn)換器,顏色轉(zhuǎn)化器 |
appender | 負責(zé)寫日志的組件,主要負責(zé)日志的輸出以及格式化日志 |
logger | 用來設(shè)置某一個包或者具體的某一個類的日志輸出級別,以及指定<appender> |
root | 用來指定最基礎(chǔ)的日志輸出級別 |
filter | 通過使用該標簽指定過濾策略 |
encoder | 使用該標簽下的標簽指定日志輸出格式 |
rollingPolicy | 指定收集策略,比如基于時間進行收集 |
2.2 contextName
? ? ??contextName標簽用于設(shè)置日志上下文名稱,后面輸出格式中可以通過定義%contextName來打印日志上下文名稱。每個logger都關(guān)聯(lián)到logger上下文,默認上下文名稱為default。可以使用<contextName>設(shè)置成其他名字,用于區(qū)分不同的應(yīng)用程序的記錄。一旦設(shè)置,不能修改。
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>myAppName</contextName>
<!--其他配置省略-->
</configuration>
2.3 property
? ? ??property標簽用來設(shè)置相關(guān)變量,通過key-value的方式配置,然后在后面的配置文件中通過 ${key}來訪問。
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property name="APP_Name" value="myAppName"></property>
<contextName>${APP_Name}</contextName>
<!--其他配置省略-->
</configuration>
2.4 timestamp
? ? ??timestamp標簽用于獲取時間戳字符串,有兩個屬性key和datePattern。
timestamp屬性 | 解釋 |
---|---|
key | 標識此<timestamp>的名字 |
datePattern | 設(shè)置將當前時間(即解析配置文件的時間)轉(zhuǎn)換為字符串,遵循java.txt.SimpleDateFormat的格式 |
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<timestamp key="bySecond"datePattern="yyyyMMdd'T'HHmmss"></timestamp>
<contextName>${bySecond}</contextName>
</configuration>
2.5 appender
? ? ??appender標簽負責(zé)主要負責(zé)日志的輸出以及格式化日志。當一個日志記錄被觸發(fā)的時候,logback會根據(jù)我們的配置信息把這個事件交給appender處理。appender有兩個必要屬性name和class。
appender屬性
appender屬性 | 解釋 |
---|---|
name | 指定appender名稱 |
class | 指定appender的全限定名 |
? ? ??append屬性class設(shè)置的不同,append子節(jié)點也不同,所以這里我們直接看appender對應(yīng)的class類型有哪些。
appender class 類型
appender類型 | class全限定名 | 解釋 |
---|---|---|
ConsoleAppender | ch.qos.logback.core.ConsoleAppender | 把日志輸出到控制臺 |
FileAppender | ch.qos.logback.core.FileAppender | 把日志輸出到文件 |
RollingFileAppender | ch.qos.logback.core.rolling.RollingFileAppender | 滾動記錄文件,先將日志文件指定到文件,當符合某個條件是,將日志記錄到其他文件 |
SocketAppender | ch.qos.logback.classic.net.SocketAppender | 輸出日志到遠程實例中,明文 |
SSLSocketAppender | ch.qos.logback.classic.net.SSLSocketAppender | 輸出日志到遠程實例中,加密 |
SMTPAppender | ch.qos.logback.classic.net.SMTPAppender | 將日志以郵件的形式發(fā)出 |
DBAppender | ch.qos.logback.classic.db.DBAppender | 將日志保存在數(shù)據(jù)庫中 |
SyslogAppender | ch.qos.logback.classic.net.SyslogAppender | 將日志發(fā)送給遠程的receiver |
SiftingAppender | ch.qos.logback.classic.sift.SiftingAppender | SiftingAppender提供過濾篩選日志的功能。你可以通過用戶的sessions的數(shù)據(jù)來篩選日志,然后分發(fā)到不同日志文件 |
AsyncAppender | ch.qos.logback.classic.AsyncAppender | 記錄ILoggingEvents的方式是異步的。它僅僅相當于一個event分配器,因此需要配合其他appender才能有所作為 |
? ? ??ConsoleAppender、FileAppender、RollingFileAppender。這幾個appender是最常用的,我們對他們的使用做一個簡單的介紹。
2.5.1 ConsoleAppender
? ? ??ConsoleAppender用于把日志輸出到控制臺。
? ? ??如下配置會把DEBUG級別的日志輸出到控制臺。
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
? ? ??ConsoleAppender節(jié)點介紹。
ConsoleAppender子節(jié)點 | 解釋 |
---|---|
encoder | 對日志進行格式化 |
target | 字符串System.out(默認)或者System.err |
filter | 對某些日志做過濾 |
2.5.2 FileAppender
? ? ??FileAppender用于把日志添加到文件。
? ? ??比如如下的配置會把DEBUG級別的日志輸出到log-${bySecond}.txt文件。
<configuration>
<!-- Insert the current time formatted as "yyyyMMdd'T'HHmmss" under
the key "bySecond" into the logger context. This value will be
available to all subsequent configuration elements. -->
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<!-- use the previously created timestamp to create a uniquely
named log file -->
<file>log-${bySecond}.txt</file>
<encoder>
<pattern>%logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
? ? ??FileAppender節(jié)點介紹。
FileAppender子節(jié)點 | 解釋 |
---|---|
file | 被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創(chuàng)建,沒有默認值 |
append | 默認為true。如果是true,日志被追加到文件結(jié)尾,如果是false,清空現(xiàn)存文件 |
encoder | 對記錄事件進行格式化 |
prudent | 默認為false。如果是true,日志會被安全的寫入文件,即其他的FileAppender也在向此文件做寫入操作,效率低 |
filter | 對某些日志做過濾 |
2.5.3 RollingFileAppender
? ? ??RollingFileAppender是對FileAppender的一個擴展。相較于它的父類,它的主要作用是滾動記錄日志。先將日志文件指定到文件,當符合某個條件時,將日志記錄到其他文件。所以這里有兩個重要的點,一是什么時候滾動(觸發(fā)triggeringPolicy)、二是發(fā)生滾動的時候怎么去保存文件(動作,策略rollingPolicy)。
? ? ??RollingFileAppender節(jié)點介紹。
RollingFileAppender子節(jié)點
RollingFileAppender子節(jié)點 | 解釋 |
---|---|
file | 被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創(chuàng)建,沒有默認值,就說說日志會先保存在這個文件里面 |
append | 默認為true。如果是true,日志被追加到文件結(jié)尾,如果是false,清空現(xiàn)存文件 |
encoder | 對記錄事件進行格式化 |
rollingPolicy | 發(fā)送滾動是,RollingFileAppender的行為。例如日志文件名的修改 |
triggeringPolicy | 決定什么時候發(fā)送日志滾動,例如日期,日志文件大小到達一定值 |
prudent | 當為true時,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有兩個限制,1不支持也不允許文件壓縮,2不能設(shè)置file屬性,必須留空 |
filter | 對某些日志做過濾 |
2.5.3.1 rollingPolicy介紹
? ? ??rollingPolicy節(jié)點用于定義當發(fā)生日志切換時(發(fā)生日志滾動是),RollingFileAppender的切換行為。例如日志文件名的修改。(RollingPolicy實際上就是負責(zé)日志文件的切換以及重命名的)。logback里面已經(jīng)給我們提供個多種切換的實現(xiàn)類。下面我們對這些實現(xiàn)類做一個簡單的介紹。
rollingPolicy類型 | 解釋 |
---|---|
TimeBasedRollingPolicy | 是最受歡迎的日志滾動策略。它的滾動策略是基于時間的,例如根據(jù)天數(shù),月份 |
SizeAndTimeBasedRollingPolicy | 有時候你不僅想通過時間來規(guī)定滾動策略,還希望同時限制每個日志文件的大小。在TimeBasedRoolingPolicy中已經(jīng)提供限制總?cè)罩疚募拇笮〉墓δ埽鳶izeAndTimeBasedRollingPolicy提供了更為強大的,針對單個日志文件的大小限制能力 |
FixedWindowRollingPolicy | 固定窗口的日志滾動策略 |
2.5.3.1.1 TimeBasedRollingPolicy
? ? ??是最受歡迎的日志滾動策略。它的滾動策略是基于時間的。根據(jù)時間觸發(fā)滾動(fileNamePattern屬性會解析到),同時可以設(shè)置保留的文件的最大大小(超過最大大小就會把之前的覆蓋掉),以及最大保留的粒度(如果是觸發(fā)保存是按天來的,可以設(shè)置最大保留多少天的日志。如果是月,可以設(shè)置最多保留多少月等等)。
注意,TimeBasedRollingPolicy已經(jīng)包含了triggeringPolicy節(jié)點的功能。所以設(shè)置了rollingPolicy為TimeBasedRollingPolicy就不需要在設(shè)置triggeringPolicy了。
? ? ??比如如下的配置,會每天保存一個日志文件,并且最大保存30天的日志,同時限制所以日志文件的最大大小為3G。
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logFile.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- keep 30 days' worth of history capped at 3GB total size -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
? ? ??TimeBasedRollingPolicy屬性介紹。
TimeBasedRollingPolicy屬性 | 類型 | 解釋 |
---|---|---|
fileNamePattern | String | 必要節(jié)點,包含文件名及"%d"轉(zhuǎn)換符,"%d"可以包含一個java.text.SimpleDateFormat指定的時間格式,默認格式是yyyy-MM-dd。也可以設(shè)置其他格式,如:%d{yyyy-MM} |
maxHistory | int | 可選參數(shù),聲明歸檔日志最大保留時間。如果你是基于月份的日志滾動,則當maxHisory為6時,說明會保留6個月的日志。大于6個月的就會被刪除。日志所存在的目錄也會被合適的刪除掉 |
totalSizeCap | String | 可選參數(shù),聲明歸檔日志的最大存儲量。當超過這個值,最老的歸檔日志文件也會被刪除 |
cleanHistoryOnStart | boolean | 可選參數(shù),聲明歸檔日志的最大存儲量。當超過這個值,最老的歸檔日志文件也會被刪除 可選參數(shù),默認為false,如果設(shè)置為true,則當appender啟動時,會刪除所有歸檔日志文件 |
舊版本的logback里可以在TimeBasedRollingPolicy這個rollingPolicy下配置一個timeBasedFileNamingAndTriggeringPolicy(實現(xiàn)類為SizeAndTimeBasedFNATP)達到同時配置時間和文件大小的滾動策略;而在新版本里可以使用SizeAndTimeBasedRollingPolicy替代。
2.5.3.1.2 SizeAndTimeBasedRollingPolicy
? ? ??有時候你不僅想通過時間來規(guī)定滾動策略,還希望同時限制每個日志文件的大小。在TimeBasedRoolingPolicy中已經(jīng)提供限制總?cè)罩疚募拇笮〉墓δ埽鳶izeAndTimeBasedRollingPolicy提供了更為強大的針對單個日志文件的大小限制能力。
? ? ??比如如下的配置,按天觸發(fā)日志的保存,同時限制了單個文件的大小。所以每天可能有多個日志文件。關(guān)于fileNamePattern的使用我們會在下文中講到。
<configuration>
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>mylog.txt</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
<maxFileSize>100MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="ROLLING" />
</root>
</configuration>
? ? ??SizeAndTimeBasedRollingPolicy屬性介紹,SizeAndTimeBasedRollingPolicy繼承TimeBasedRollingPolicy就額外的多一個屬性maxFileSize
SizeAndTimeBasedRollingPolicy屬性 | 類型 | 解釋 |
---|---|---|
fileNamePattern | String | 必要節(jié)點,包含文件名及"%d"轉(zhuǎn)換符,"%d"可以包含一個java.text.SimpleDateFormat指定的時間格式,默認格式是yyyy-MM-dd。也可以設(shè)置其他格式,如:%d{yyyy-MM} |
maxHistory | int | 可選參數(shù),聲明歸檔日志最大保留時間。如果你是基于月份的日志滾動,則當maxHisory為6時,說明會保留6個月的日志。大于6個月的就會被刪除。日志所存在的目錄也會被合適的刪除掉 |
totalSizeCap | String | 可選參數(shù),聲明歸檔日志的最大存儲量。當超過這個值,最老的歸檔日志文件也會被刪除 |
cleanHistoryOnStart | boolean | 可選參數(shù),聲明歸檔日志的最大存儲量。當超過這個值,最老的歸檔日志文件也會被刪除 可選參數(shù),默認為false,如果設(shè)置為true,則當appender啟動時,會刪除所有歸檔日志文件 |
maxFileSize | String | 限定單個日志文件的大小 |
2.5.3.1.3 FixedWindowRollingPolicy
? ? ??基于窗口大小的滾動策略。這個聽起來可能有點難理解,其實說白了就是將歸檔日志文件到最大了就寫到下一個文件里,而窗口大小就是最多允許多少份日志文件。要特別注意FixedWindowRollingPolicy是沒有告知什么時候觸發(fā)日志的保存的。所以FixedWindowRollingPolicy的使用需要配合triggeringPolicy標簽一起使用,而且一般triggeringPolicy標簽會設(shè)置SizeBasedTriggeringPolicy。
? ? ??比如如下的配置,保存DEBUG級別的日志,并且每5MB保存一個文件,窗口大小是1到3,當保存了3個歸檔文件后,將覆蓋最早的日志。
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>test.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>tests.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
? ? ??FixedWindowRollingPolicy屬性屬性介紹。
FixedWindowRollingPolicy屬性 | 類型 | 解釋 |
---|---|---|
minIndex | int | 這個參數(shù)指定窗口索引的最小值 |
maxIndex | int | 這個參數(shù)指定窗口索引的最大值 |
fileNamePattern | String | 這個參數(shù)與之前的fileNamePattern沒什么差別,唯一需要注意的是必須包含%i標識符,這個標識符的作用是指明當前窗口索引的值。例如將fileNamePattern設(shè)置成 "MyLogFile%i ",minIndex為1,maxIndex為3,則會創(chuàng)建MyLogFile1.log, MyLogFile2.log and MyLogFile3.log.這三個歸檔日志文件。 |
特別要注意,如果rollingPolicy標簽設(shè)置為FixedWindowRollingPolicy。一定要設(shè)置triggeringPolicy標簽的內(nèi)容。要不然是沒辦法觸發(fā)保存日志的。
2.5.3.2 triggeringPolicy介紹
? ? ??triggeringPolicy標簽設(shè)置的值用于告知RollingFileAppender什么時候觸發(fā)滾動操作。上面rollingPolicy介紹的各種rollingPolicy類型里面,其實TimeBasedRollingPolicy和SizeAndTimeBasedRollingPolicy已經(jīng)包含了triggeringPolicy的功能(會通過fileNamePattern屬性解析出來),只有FixedWindowRollingPolicy是沒有triggeringPolicy功能的,所以FixedWindowRollingPolicy要設(shè)置triggeringPolicy。一般都是設(shè)置SizeBasedTriggeringPolicy。
? ? ??SizeBasedTriggeringPolicy只有一個屬性,就是文件大小。當?shù)竭_了設(shè)置的大小的時候RollingFileAppender就觸發(fā)一次滾動操作。
SizeBasedTriggeringPolicy屬性 | 類型 | 解釋 |
---|---|---|
maxFileSize | String | 默認10MB, 當?shù)竭_這個容量,就開啟日志滾動 |
2.6 filter
? ? ??logback的過濾器可以過濾記錄日志的內(nèi)容,執(zhí)行一個過濾器會有返回個枚舉值,即DENY,NEUTRAL,ACCEPT其中之一。從而將不符合條件的日志信息過濾掉。
- DENY: 日志將立即被拋棄不再經(jīng)過其他過濾器。
- NEUTRAL: 有序列表里的下個過濾器過接著處理日志。
- ACCEPT: 日志會被立即處理,不再經(jīng)過剩余過濾器。
? ? ??過濾器被添加到<Appender>中,為<Appender>添加一個或多個過濾器后,可以用任意條件對日志進行過濾。<Appender>有多個過濾器時,按照配置順序執(zhí)行。
? ? ??關(guān)于Filter的實現(xiàn)類有多種,這里我們主要講兩種:LevelFilter以及ThresholdFilter.
2.6.1 LevelFilter
? ? ??級別過濾器,根據(jù)日志級別進行過濾。如果日志級別等于配置級別,過濾器會根據(jù)onMath 和 onMismatch接收或拒絕日志。
LevelFilter子節(jié)點 | 解釋 |
---|---|
level | 設(shè)置過濾級別 |
onMatch | 用于配置符合過濾條件的操作 |
onMismatch | 用于配置不符合過濾條件的操作 |
? ? ??比如以下的配置,只接受ERROR級別的日志,非ERROR級別的日志都會被過濾掉。
<appender name="ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/${ERROR_LOG_FILE_NAME}.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/${errorLogFileNamePattern}.log.zip
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory><!-- days -->
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<pattern>${fileLayoutPattern}</pattern>
</encoder>
</appender>
2.6.2 ThresholdFilter
? ? ??臨界值過濾器,過濾掉低于指定臨界值的日志。ThresholdFilter只有一個level子節(jié)點可以設(shè)置。當日志級別等于或高于臨界值時,過濾器返回NEUTRAL;當日志級別低于臨界值時,日志會被拒絕。
? ? ??比如如下的配置,過濾掉TRACE和DEBUG級別的日志。
<appender name="ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/${ERROR_LOG_FILE_NAME}.log</file>
<!-- 過濾掉 TRACE 和 DEBUG 級別的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/${errorLogFileNamePattern}.log.zip
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory><!-- days -->
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<pattern>${fileLayoutPattern}</pattern>
</encoder>
</appender>
2.6.3 EvaluatorFilter
? ? ??求值過濾器,評估、鑒別日志是否符合指定條件。需要額外的兩個JAR包,commons-compiler.jar和janino.jar。
EvaluatorFilter子節(jié)點 | 解釋 |
---|---|
evaluator | 鑒別器,常用的鑒別器是JaninoEventEvaluato,也是默認的鑒別器,它以任意的java布爾值表達式作為求值條件,求值條件在配置文件解釋過成功被動態(tài)編譯,布爾值表達式返回true就表示符合過濾條件。evaluator有個子標簽<expression>,用于配置求值條件 |
onMatch | 用于配置符合過濾條件的操作 |
onMismatch | 用于配置不符合過濾條件的操作 |
? ? ??這里注意下evaluator子節(jié)點的使用,。evaluator有個子標簽<expression>,用于配置求值條件。求值表達式作用于當前日志,logback向求值表達式暴露日志的各種字段如下:
expression可以使用字段 | 類型 | 含義 |
---|---|---|
event | LoggingEvent | 與記錄請求相關(guān)聯(lián)的原始記錄事件,下面所有變量都來自event,例如,event.getMessage()返回下面"message"相同的字符串 |
message | String | 日志的原始消息,例如,設(shè)有l(wèi)ogger mylogger,"name"的值是"AUB",對于 mylogger.info("Hello {}",name); "Hello {}"就是原始消息。 |
formatedMessage | String | 日志被各式話的消息,例如,設(shè)有l(wèi)ogger mylogger,"name"的值是"AUB",對于 mylogger.info("Hello {}",name); "Hello Aub"就是格式化后的消息。 |
logger | String | logger 名。 |
loggerContext | LoggerContextVO | 日志所屬的logger上下文。 |
level | int | 級別對應(yīng)的整數(shù)值,所以 level > INFO 是正確的表達式。 |
timeStamp | long | 創(chuàng)建日志的時間戳。 |
marker | Marker | 與日志請求相關(guān)聯(lián)的Marker對象,注意“Marker”有可能為null,所以你要確保它不能是null |
mdc | Map | 包含創(chuàng)建日志期間的MDC所有值得map。訪問方法是:mdc.get("myKey") 。mdc.get()返回的是Object不是String,要想調(diào)用String的方法就要強轉(zhuǎn),例如,((String) mdc.get("k")).contains("val") .MDC可能為null,調(diào)用時注意。 |
throwable | java.lang.Throwable | 如果沒有異常與日志關(guān)聯(lián)"throwable" 變量為 null. 不幸的是, "throwable" 不能被序列化。在遠程系統(tǒng)上永遠為null,對于與位置無關(guān)的表達式請使用下面的變量throwableProxy |
throwableProxy | IThrowableProxy | 與日志事件關(guān)聯(lián)的異常代理。如果沒有異常與日志事件關(guān)聯(lián),則變量"throwableProxy" 為 null. 當異常被關(guān)聯(lián)到日志事件時,"throwableProxy" 在遠程系統(tǒng)上不會為null |
? ? ??比如如下的配置,過濾掉所有日志消息中不包含“billing”字符串的日志。
<appender name="ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/${ERROR_LOG_FILE_NAME}.log</file>
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator> <!-- 默認為 ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
<expression>return message.contains("billing");</expression>
</evaluator>
<OnMatch>ACCEPT </OnMatch>
<OnMismatch>DENY</OnMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/${errorLogFileNamePattern}.log.zip
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory><!-- days -->
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<pattern>${fileLayoutPattern}</pattern>
</encoder>
</appender>
2.7 logger,root
2.7.1 logger
? ? ??用來設(shè)置某一個包或者具體某一個類的日志打印級別,以及指定<appender>。什么意思。
logger屬性 | 解釋 |
---|---|
name | 用來指定受此loger約束的某一個包或者具體的某一個類 |
level | 用來設(shè)置打印級別,大小寫無關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執(zhí)行上級的級別。如果未設(shè)置此屬性,那么當前l(fā)oger將會繼承上級(root標簽)的級別 |
addtivity | 是否向上級loger傳遞打印信息。默認是true |
? ? ??關(guān)于addtivity。如果addtivity設(shè)置為true,那么當前l(fā)ogger標簽作用完之后,logger標簽對應(yīng)類或者包的父類,繼續(xù)作用一直到root標簽。如果addtivity設(shè)置為false,那么當前l(fā)ogger標簽作用完之后就直接掐斷了,不在繼續(xù)往上走了。
? ? ??<loger>可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個loger。<appender-ref>標簽就是去指定日志的相應(yīng)操作,不管是控制臺輸出,還是保存到文件,還是滾動日志輸出啥的。
2.7.2 root
? ? ??<root>也是<loger>元素,但是它是根loger。只有一個level屬性。用來設(shè)置打印級別。
root是不用指定包或者類的,我們可以簡單的認為root指定了所有的包.
? ? ??這里要重點說下logger和root的關(guān)系。怕有些同學(xué)搞混掉.我們通過幾個例子來說明。
2.7.3 root,logger關(guān)系
? ? ??關(guān)于root和logger之間的關(guān)系要重點講下。當root和logger同時存在的時候。要特別注意logger和root標簽兩者最終的level;和logger標簽是否設(shè)置了向上傳遞的屬性。
- logger沒有設(shè)置level,那么logger直接繼承root的level(如果有多個logger并且logger直接有上下級關(guān)系的話,就一層一層往上)。
- logger設(shè)置了level,同時如果logger設(shè)置了向上傳遞的話(additivity="true")。那么root標簽和logger相同的包也使用logger的level。
2.7.3.1 情況一
<logger name="com.tuacy.logback"/>
<root level="info">
<!-- 控制臺輸出 -->
<appender-ref ref="CONSOLE"/>
</root>
? ? ??因為logger沒有設(shè)置等級,直接繼承root的等級.addtivity默認就是true向上傳遞.可以認為當com.tuacy.logback包里面某個類打印日志的時候使用的配置為.
<logger name="com.tuacy.logback" level="info" additivity="true"/>
<root level="info">
<!-- 控制臺輸出 -->
<appender-ref ref="CONSOLE"/>
</root>
? ? ??logger沒有設(shè)置appender-ref所以logger沒啥用,不打印,這個時候只有root設(shè)置起作用,com.tuacy.logback包下面的類info,warn,error的日志都會打印出來。
2.7.3.2 情況二
<logger name="com.tuacy.logback" additivity="false"/>
<root level="info">
<!-- 控制臺輸出 -->
<appender-ref ref="CONSOLE"/>
</root>
? ? ??logger沒有設(shè)置等級,繼承root的等級,additivity為false,不往上傳遞,root不作用。配置相當于
<logger name="com.tuacy.logback" additivity="false"/>
? ? ??如果這個時候有com.tuacy.logback包或者子包有打印的時候,不會有任何打印信息。
2.7.3.3 情況三
<logger name="com.tuacy.logback" level="error"/>
<root level="info">
<!-- 控制臺輸出 -->
<appender-ref ref="CONSOLE"/>
</root>
? ? ??logger和root都有設(shè)置等級取兩者等級較高的。所以上述配置等價于
<logger name="com.tuacy.logback" level="error" additivity="true"/>
<root level="error">
<!-- 控制臺輸出 -->
<appender-ref ref="CONSOLE"/>
</root>
? ? ??這個時候只有error級別的信息會打印出來,root也使用logger的level。注意,只是針對com.tuacy.logback包和他的子包root的等級改變了。其他的包root還是保持原來的level。
2.7.3.4 情況四
<logger name="com.tuacy.logback" level="error" additivity="false"/>
<root level="info">
<!-- 控制臺輸出 -->
<appender-ref ref="CONSOLE"/>
</root>
? ? ??上述配置等價于
<logger name="com.tuacy.logback" level="error" additivity="false"/>
? ? ??不會有打印的
2.7.3.5 情況五
<logger name="com.tuacy.logback" level="error">
<!-- 控制臺輸出 -->
<appender-ref ref="CONSOLE"/>
</logger>
<root level="info">
<!-- 控制臺輸出 -->
<appender-ref ref="CONSOLE"/>
</root>
? ? ??上述配置等價于
<logger name="com.tuacy.logback" level="error">
<!-- 控制臺輸出 -->
<appender-ref ref="CONSOLE"/>
</logger>
<root level="error">
<!-- 控制臺輸出 -->
<appender-ref ref="CONSOLE"/>
</root>
? ? ??會打印error級別的日志,而且會打印兩次。logger的一次,root的一次。
2.7.3.6 情況六
<logger name="com.tuacy.logback" level="error" additivity="false">
<!-- 控制臺輸出 -->
<appender-ref ref="CONSOLE"/>
</logger>
<root level="info">
<!-- 控制臺輸出 -->
<appender-ref ref="CONSOLE"/>
</root>
? ? ??上述配置等價于
<logger name="com.tuacy.logback" level="error" additivity="false">
<!-- 控制臺輸出 -->
<appender-ref ref="CONSOLE"/>
</logger>
? ? ??所以只會打印一次error級別的日志信息。
2.8 日志模板配置
? ? ??日志模板配置,使用%為前綴讓解析器識別特殊輸出模式,然后以{}后綴結(jié)尾,內(nèi)部指定相應(yīng)的參數(shù)設(shè)置。
2.8.1 模板輸入?yún)?shù)
模板輸入?yún)?shù) | 對應(yīng)的類 | 對應(yīng)輸出 |
---|---|---|
d | DateConverter | 輸出logger時間 |
date | DateConverter | 輸出logger時間 |
r | RelativeTimeConverter | 輸出應(yīng)用啟動到日志時間觸發(fā)時候的毫秒數(shù) |
relative | RelativeTimeConverter | 輸出應(yīng)用啟動到日志時間觸發(fā)時候的毫秒數(shù) |
level | LevelConverter | 輸出logger對應(yīng)的等級 |
le | LevelConverter | 輸出logger對應(yīng)的等級 |
p | LevelConverter | 輸出logger對應(yīng)的等級 |
t | ThreadConverter | 輸出logger對應(yīng)線程名字 |
thread | ThreadConverter | 輸出logger對應(yīng)線程名字 |
lo | LoggerConverter | 輸出logger對應(yīng)的名字 |
logger | LoggerConverter | 輸出logger對應(yīng)的名字 |
c | LoggerConverter | 輸出logger對應(yīng)的名字 |
m | MessageConverter | 輸出logger對應(yīng)的信息 |
msg | MessageConverter | 輸出logger對應(yīng)的信息 |
message | MessageConverter | 輸出logger對應(yīng)的信息 |
C | ClassOfCallerConverter | 輸出調(diào)用方發(fā)布日志事件的完整類名 |
class | ClassOfCallerConverter | 輸出調(diào)用方發(fā)布日志事件的完整類名 |
M | MethodOfCallerConverter | 輸出發(fā)布日志請求的方法名 |
method | MethodOfCallerConverter | 輸出發(fā)布日志請求的方法名 |
L | LineOfCallerConverter | 輸出log請求的行數(shù) |
line | LineOfCallerConverter | 輸出log請求的行數(shù) |
F | FileOfCallerConverter | 輸出發(fā)布日志請求的java源碼的文件名 |
file | FileOfCallerConverter | 輸出發(fā)布日志請求的java源碼的文件名 |
X | MDCConverter | 輸出和發(fā)布日志事件關(guān)聯(lián)的線程的MDC |
mdc | MDCConverter | 輸出和發(fā)布日志事件關(guān)聯(lián)的線程的MDC |
ex | ThrowableProxyConverter | 輸出和日志事件關(guān)聯(lián)的異常的堆棧信息 |
exception | ThrowableProxyConverter | 輸出和日志事件關(guān)聯(lián)的異常的堆棧信息 |
rEx | RootCauseFirstThrowableProxyConverter | 輸出和日志事件關(guān)聯(lián)的異常的堆棧信息 |
rootException | RootCauseFirstThrowableProxyConverter | 輸出和日志事件關(guān)聯(lián)的異常的堆棧信息 |
throwable | ThrowableProxyConverter | 輸出和日志事件關(guān)聯(lián)的異常的堆棧信息 |
xEx | ExtendedThrowableProxyConverter | 和上面一樣,此外增加類的包信息 |
xException | ExtendedThrowableProxyConverter | 和上面一樣,此外增加類的包信息 |
xThrowable | ExtendedThrowableProxyConverter | 和上面一樣,此外增加類的包信息 |
nopex | NopThrowableInformationConverter | 當我們想不輸出異常信息時,使用這個。其假裝處理異常,其實無任何輸出 |
nopexception | NopThrowableInformationConverter | 當我們想不輸出異常信息時,使用這個。其假裝處理異常,其實無任何輸出 |
cn | ContextNameConverter | 輸出在類附加到日志上的上下文名字 |
contextName | ContextNameConverter | 輸出在類附加到日志上的上下文名字 |
caller | CallerDataConverter | 輸出產(chǎn)生日志事件的調(diào)用者的位置信息 |
marker | MarkerConverter | 輸出和日志請求關(guān)聯(lián)的marker |
property | PropertyConverter | 輸出屬性對應(yīng)的值,一般為System.properties中的屬性 |
n | LineSeparatorConverter | 輸出依賴系統(tǒng)的行分隔符 |
black | BlackCompositeConverter | 顏色格式black |
red | RedCompositeConverter | 顏色格式red |
green | GreenCompositeConverter | 顏色格式green |
yellow | YellowCompositeConverter | 顏色格式y(tǒng)ellow |
blue | BlueCompositeConverter | 顏色格式blue |
magenta | MagentaCompositeConverter | 顏色格式magenta |
cyan | CyanCompositeConverter | 顏色格式cyan |
white | WhiteCompositeConverter | 顏色格式white |
gray | GrayCompositeConverter | 顏色格式gray |
boldRed | BoldRedCompositeConverter | 顏色格式boldRed |
boldGreen | BoldGreenCompositeConverter | 顏色格式boldGreen |
boldYellow | BoldYellowCompositeConverter | 顏色格式boldYellow |
boldBlue | BoldBlueCompositeConverter | 顏色格式boldBlue |
boldMagenta | BoldMagentaCompositeConverter | 顏色格式boldMagenta |
boldCyan | BoldCyanCompositeConverter | 顏色格式boldCyan |
boldWhite | BoldWhiteCompositeConverter | 顏色格式boldWhite |
highlight | HighlightingCompositeConverter | 顏色格式highlight |
lsn | LocalSequenceNumberConverter | 顏色格式lsn |
? ? ??d,data可以配置額外的參數(shù),用來確定日期格式。輸出日志的打印日志,模式語法與java.text.SimpleDateFormat 兼容。
? ? ??c、lo、logger輸出日志的logger名,可有一個整形參數(shù),功能是縮短logger名,設(shè)置為0表示只輸入logger最右邊點符號之后的字符串
模板 | 數(shù)據(jù)源 | 結(jié)果 |
---|---|---|
%logger | mainPackage.sub.sample.Bar | mainPackage.sub.sample.Bar |
%logger{0} | mainPackage.sub.sample.Bar | Bar |
%logger{5} | mainPackage.sub.sample.Bar | m.s.s.Bar |
%logger{10} | mainPackage.sub.sample.Bar | m.s.s.Bar |
%logger{15} | mainPackage.sub.sample.Bar | m.s.sample.Bar |
%logger{16} | mainPackage.sub.sample.Bar | m.sub.sample.Bar |
%logger{26} | mainPackage.sub.sample.Bar | mainPackage.sub.sample.Bar |
2.8.2 模板長度設(shè)置
? ? ??每個模板配置都是可以限制模長度的,上面介紹了模塊可以設(shè)置那么多的輸入?yún)?shù),其實每個輸入?yún)?shù)都是可以限制長度的。
日志模板配置 | 解釋 |
---|---|
%5p | 級別從左顯示5個字符寬度(從左到右) |
%-4L | 行號,保留后面四位字符寬度(從右到左) |
%15.20t | 線程名字(如果寬度不足15,左側(cè)補空白;如果寬度超過20,從左側(cè)截斷) |
三 spring boot項目使用logback
3.1 pom依賴
? ? ??在Spring Boot項目中要使用logback原則上是要添加spring-boot-starter-logging依賴的。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
但是因為我們使用Spring Boot肯定會添加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
又因為spring-boot-starter里面已經(jīng)包含了對于spring-boot-starter-logging的依賴,所以我們一般在項目中不用顯示的添加spring-boot-starter-logging。
3.1 logback配置文件
? ? ??spring boot項目中使用logback.關(guān)于配置文件官方推薦使用的xml名字的格式為:logback-spring.xml而不是logback.xml(當然了,你也可以使用logback.xml),因為帶spring后綴的可以使用<springProfile>這個標簽來控制比如生成環(huán)境還是調(diào)試環(huán)境。比如如下的配置分了對生成環(huán)境和開發(fā)環(huán)境做了一個簡單的區(qū)分.
<configuration scan="true" scanPeriod="10 seconds">
...
<!-- 生產(chǎn)環(huán)境下,將此級別配置為適合的級別,以免日志文件太多或影響程序性能 -->
<!--
<root>元素也是<logger>元素,logger。只有一個level屬性。
root 元素配置根 logger。該元素有一個 level 屬性。沒有 name 屬性,因為已經(jīng)被命名為“root”
<root>可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個logger。
-->
<springProfile name="dev">
<root level="info">
<!-- 控制臺輸出 -->
<appender-ref ref="CONSOLE"/>
<!-- 文件輸出 -->
<appender-ref ref="SYS_LOG"/>
<!-- 錯誤日志 -->
<appender-ref ref="ERROR_LOG"/>
</root>
</springProfile>
<springProfile name="pro">
<root level="warn">
<!-- 控制臺輸出 -->
<appender-ref ref="CONSOLE"/>
<!-- 文件輸出 -->
<appender-ref ref="SYS_LOG"/>
<!-- 錯誤日志 -->
<appender-ref ref="ERROR_LOG"/>
</root>
</springProfile>
</configuration>