廈門大型企業(yè)網(wǎng)站開發(fā)公司高級seo招聘
logback-spring.xml的配置項
共有一個父標(biāo)簽、兩種屬性、三個節(jié)點:
? 一個父標(biāo)簽:configuration
? 兩種屬性:contextName和property
? 三個節(jié)點:appender、root、logger
日志級別
?日志級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設(shè)置為WARN,則低于WARN的信息都不會輸出
一、一個父標(biāo)簽
<configuration ?scan="true" scanPeriod="10 seconds">
</configuration>
?
- scan
當(dāng)此屬性設(shè)置為true時,配置文件如果發(fā)生改變,將會被重新加載,默認(rèn)值為true
- scanPeriod
設(shè)置監(jiān)測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認(rèn)單位是毫秒。當(dāng)scan為true時,此屬性生效。默認(rèn)的時間間隔為1分鐘。
- debug
當(dāng)此屬性設(shè)置為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài)。默認(rèn)值為false。
?
二、兩種屬性 contextName和property
-
contextName
每個logger都關(guān)聯(lián)到logger上下文,默認(rèn)上下文名稱為“default”。但可以使用設(shè)置成其他名字,用于區(qū)分不同應(yīng)用程序的記錄。一旦設(shè)置,不能修改。
如果同時存在logback.xml和logback-spring.xml,或者同時存在logback.xml和自定義的配置文件,則會先加載logback.xml,再根據(jù)application配置加載指定配置文件,或加載logback-spring,xml。如果這兩個配置文件的contextName不同,就會報錯:
# logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration ?scan="true" scanPeriod="60 seconds" debug="false">
? ? <contextName>logback</contextName>
</configuration>
# logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration ?scan="true" scanPeriod="60 seconds" debug="false">
? ? <contextName>logback</contextName>
</configuration>
# application.properties
logging.config=classpath:logback-spring.xml
ERROR in ch.qos.logback.classic.joran.action.ContextNameAction - Failed to rename context [logback] as [logback_demo] java.lang.IllegalStateException: Context has been already given a name
-
property
用來定義變量值的標(biāo)簽, 有兩個屬性,name和value;其中name的值是變量的名稱,value的值時變量定義的值。通過定義的值會被插入到logger上下文中。定義變量后,可以使“${}”來使用變量。
例如使用定義上下文名稱,然后在設(shè)置logger上下文時使用。
<configuration scan="true" scanPeriod="60 seconds" debug="false"> ?
? ? ? <property name="APP_Name" value="myAppName" /> ??
? ? ? <contextName>${APP_Name}</contextName> ?
</configuration>
三、三個節(jié)點 appender、root、logger
-
append節(jié)點
appender的意思是追加器,在這里可以理解為一個日志的渲染器(或者說格式化日志輸出)。比如渲染console日志為某種格式,渲染文件日志為另一種格式。
appender中有name和class兩個屬性,有rollingPolicy和encoder兩個子節(jié)點。
name表示該渲染器的名字,class表示使用的輸出策略,常見的有控制臺輸出策略和文件輸出策略。
控制臺輸出appender
<property name="log.path" value="./fmsdconflog/nmys" /><!--輸出到控制臺 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><!--此日志appender是為開發(fā)使用,只配置最底級別,控制臺輸出的日志級別是大于或等于此級別的日志信息 --><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>info</level></filter><encoder><Pattern>%-5p [%d][%mdc{mdc_accNo}] %C:%L - %m %n</Pattern><!-- 設(shè)置字符集 --><charset>UTF-8</charset></encoder></appender>
<contextName>
標(biāo)簽用于定義日志框架的名稱,這里使用的是logback。<property>
標(biāo)簽用于定義變量名和變量值,可以在后續(xù)的日志配置中使用${}
來引用定義的變量。在本例中,定義了變量log.path
的值為./fmsdconflog/nmys
,表示日志文件的存儲路徑。<appender>
標(biāo)簽用于定義日志輸出的目標(biāo),可以是控制臺、文件、數(shù)據(jù)庫等。在本例中,定義了一個名為CONSOLE
的appender,用于將日志輸出到控制臺。class
屬性指定了appender的實現(xiàn)類,這里使用的是ch.qos.logback.core.ConsoleAppender
,表示將日志輸出到控制臺。<filter>
標(biāo)簽用于過濾日志,只有符合條件的日志才會被輸出。在本例中,使用了ThresholdFilter
實現(xiàn)類,表示只輸出大于或等于info級別的日志信息。<level>
標(biāo)簽表示日志級別,這里設(shè)置為info級別。<encoder>
標(biāo)簽用于設(shè)置日志格式,定義了輸出日志時的具體格式,可以包含時間、線程、日志級別、類名、方法名、日志信息等。在本例中,使用了Pattern
模式來定義日志輸出格式,其中%-5p
表示日志級別,%d
表示時間,%mdc{mdc_accNo}
表示MDC中名稱為mdc_accNo
的變量,%C
表示輸出日志的線程的類名,%L
表示輸出日志的線程的方法名,%m
表示日志信息,%n
表示換行符。<charset>
標(biāo)簽用于設(shè)置字符集,這里設(shè)置為UTF-8,表示日志信息以UTF-8的編碼方式輸出。
文件輸入appender
文件輸出主要包括配置:以指定格式將日志輸出到指定文件夾下的文件中,可以配置該文件的名稱、最大大小、保存時間等。
<!--輸出到文件--><!-- 時間滾動輸出 level為 DEBUG 日志 --><appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在記錄的日志文件的路徑及文件名 --><!--先將今天的日志保存在這個文件中--><file>${log.path}/log_debug.log</file><!--日志文件輸出格式 %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n%d{HH: mm:ss.SSS}——日志輸出時間%thread——輸出日志的進(jìn)程名字,這在Web應(yīng)用以及異步任務(wù)處理中很有用%-5level——日志級別,并且使用5個字符靠左對齊%logger{36}——日志輸出者的名字%msg——日志消息%n——平臺的換行符--><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><charset>UTF-8</charset> <!-- 設(shè)置字符集 --></encoder><!-- 日志記錄器的滾動策略,按日期,按大小記錄 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- rollover daily --><!--如果第二天輸出日志,會將當(dāng)天的日志記錄在<file>${log.path}/log_debug.log</file>,然后將昨天的日志歸檔到下面的文件中--><!--以分鐘切分 %d{yyyy-MM-dd_HH-mm}--><fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd_HH-mm}.%i.log</fileNamePattern><!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB --><!--單個日志文件最大100M,到了這個值,就會再創(chuàng)建一個日志文件,日志文件的名字最后+1--><maxFileSize>100MB</maxFileSize><!--日志文件保留天數(shù)--><maxHistory>30</maxHistory><!--所有的日志文件最大20G,超過就會刪除舊的日志--><totalSizeCap>20GB</totalSizeCap></rollingPolicy><!-- 此日志文件只記錄debug級別的 onMatch和onMismatch都有三個屬性值,分別為Accept、DENY和NEUTRALonMatch="ACCEPT" 表示匹配該級別及以上onMatch="DENY" 表示不匹配該級別及以上onMatch="NEUTRAL" 表示該級別及以上的,由下一個filter處理,如果當(dāng)前是最后一個,則表 示匹配該級別及以上onMismatch="ACCEPT" 表示匹配該級別以下onMismatch="NEUTRAL" 表示該級別及以下的,由下一個filter處理,如果當(dāng)前是最后一個,則不匹配該級別以下的onMismatch="DENY" 表示不匹配該級別以下的--><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>debug</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender>
<appender name="ERROR_FILE"class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在記錄的日志文件的路徑及文件名 --><file>${log.path}/log_error.log</file><!--日志文件輸出格式 --><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n</pattern><charset>UTF-8</charset> <!-- 設(shè)置字符集 --></encoder><!-- 日志記錄器的滾動策略,按日期,按大小記錄 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志歸檔 --><fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern><timeBasedFileNamingAndTriggeringPolicyclass="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy><!--日志文件保留天數(shù) --><maxHistory>15</maxHistory></rollingPolicy><!-- 此日志文件只記錄debug級別的 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>error</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender>
<appender>
標(biāo)簽表示日志輸出目標(biāo),這里定義了一個名為ERROR_FILE
的appender。class
屬性指定了appender的實現(xiàn)類,這里使用的是ch.qos.logback.core.rolling.RollingFileAppender
,表示將日志輸出到文件。<file>
標(biāo)簽指定了正在記錄的日志文件的路徑及文件名,${log.path}/log_error.log
表示日志文件存儲在${log.path}
變量定義的路徑下,文件名為log_error.log
。<encoder>
標(biāo)簽用于設(shè)置輸出日志的格式,與前面的例子類似,但是添加了時間格式化。<rollingPolicy>
標(biāo)簽用于設(shè)置日志滾動策略,按日期或按大小記錄日志。在本例中使用的是按日期記錄的策略TimeBasedRollingPolicy
。<fileNamePattern>
標(biāo)簽指定了日志歸檔的文件名格式,${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log
表示日志文件存儲在${log.path}/error
路徑下,文件名格式為log-error-日期.序號.log
。<timeBasedFileNamingAndTriggeringPolicy>
標(biāo)簽用于設(shè)置日志文件滾動觸發(fā)策略,這里使用的是SizeAndTimeBasedFNATP
,表示按時間和文件大小來觸發(fā)滾動。<maxFileSize>
標(biāo)簽設(shè)置單個日志文件的最大大小,這里設(shè)置為100MB
。<maxHistory>
標(biāo)簽設(shè)置保留歷史日志文件的天數(shù),這里設(shè)置為15
天。<filter>
標(biāo)簽用于過濾日志,只有符合條件的日志才會被輸出。在本例中,使用了LevelFilter
實現(xiàn)類,表示只輸出error級別的日志信息。<level>
標(biāo)簽表示日志級別,這里設(shè)置為error級別。<onMatch>
和<onMismatch>
標(biāo)簽用于匹配過濾條件時的行為,ACCEPT
表示接受,即輸出符合條件的日志信息,DENY
表示拒絕,即不輸出符合條件的日志信息。
root
root節(jié)點實際上是配置啟動哪種appender,可以添加多個appender
<!--root配置必須在appender下邊-->
<!--root節(jié)點是對所有appender的管理,添加哪個appender就會打印哪個appender的日志-->
<!--root節(jié)點的level是總的日志級別控制,如果appender的日志級別設(shè)定比root的高,會按照appender的日志級別打印日志,-->
<!--如果appender的日志級別比root的低,會按照root設(shè)定的日志級別進(jìn)行打印日志-->
<!--也就是說root設(shè)定的日志級別是最低限制,如果root設(shè)定級別為最高ERROR,那么所有appender只能打印最高級別的日志-->
<root level="DEBUG">
? <appender-ref ref="CONSOLE" />
? <appender-ref ref="DEBUG_FILE" />
? <appender-ref ref="INFO_FILE" />
? <appender-ref ref="WARN_FILE" />
? <appender-ref ref="ERROR_FILE" />
</root>
logger和root的關(guān)系
- root和logger是父子的關(guān)系
logger的appender根據(jù)參數(shù)additivity決定是否要疊加root的appender,logger的級別是其自身定義的級別,和root的級別沒什么關(guān)系。
- logger對單個包或類添加配置,相當(dāng)于局部配置,root相當(dāng)于全局配置
如果logger里面配置了additivity=“false”,就會覆蓋root的,只打印一遍;但是additivity=“true”,就會向上層再次傳遞,不會覆蓋,而是打印兩遍!
舉例說明:
測試方法:
package com.pikaiqu.logbackdemo;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class LogbackdemoApplicationTests {
?? ?private static Logger log = LoggerFactory.getLogger(LogbackdemoApplicationTests.class);
?? ?@Test?
?? ?void logTest() {
?? ??? ?log.trace("======trace");
?? ??? ?log.debug("======debug");
?? ??? ?log.info("======info");
?? ??? ?log.warn("======warn");
?? ??? ?log.error("======error");
?? ?}
}
?
只配置root
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="false" scanPeriod="60 seconds" debug="false">
? ? <contextName>logback_demo</contextName>
? ? <property name="pattern-color" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>? ? <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
? ? ? ? <!-- encoder 默認(rèn)配置為PatternLayoutEncoder -->
? ? ? ? <encoder>
? ? ? ? ? ? <pattern>${pattern-color}}</pattern>
? ? ? ? </encoder>
? ? </appender>? ? <root level="INFO">
? ? ? ? <appender-ref ref="STDOUT" />
? ? </root></configuration>
=================================輸出結(jié)果============================================
2022-04-26 15:37:48.441 [main] INFO ?c.pikaiqu.logbackdemo.LogbackdemoApplicationTests - ======info?
2022-04-26 15:37:48.441 [main] WARN ?c.pikaiqu.logbackdemo.LogbackdemoApplicationTests - ======warn?
2022-04-26 15:37:48.441 [main] ERROR c.pikaiqu.logbackdemo.LogbackdemoApplicationTests - ======error
?
當(dāng)執(zhí)行測試方法時,root將級別為“INFO”及大于“INFO”的日志信息交給已經(jīng)配置好的名為“STDOUT”的appender處理,“STDOUT”appender將信息打印到控制臺;
- 配置root和logger,但logger不指定級別,不指定appender(指logger沒有指定appender)
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="false" scanPeriod="60 seconds" debug="false">
? ? <contextName>logback_demo</contextName>
? ? <property name="pattern-color" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>? ? <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
? ? ? ? <!-- encoder 默認(rèn)配置為PatternLayoutEncoder -->
? ? ? ? <encoder>
? ? ? ? ? ? <pattern>${pattern-color}}</pattern>
? ? ? ? </encoder>
? ? </appender>? ? <logger name="com.pikaiqu.logbackdemo" ></logger>
? ? <root level="INFO">
? ? ? ? <appender-ref ref="STDOUT" />
? ? </root></configuration>
=================================輸出結(jié)果============================================
2022-04-26 15:39:09.351 [main] INFO ?c.pikaiqu.logbackdemo.LogbackdemoApplicationTests - ======info?
2022-04-26 15:39:09.351 [main] WARN ?c.pikaiqu.logbackdemo.LogbackdemoApplicationTests - ======warn?
2022-04-26 15:39:09.351 [main] ERROR c.pikaiqu.logbackdemo.LogbackdemoApplicationTests - ======error?
?
將控制com.pikaiqu.logbackdemo包下的所有類的日志的打印,但是并沒用設(shè)置打印級別,所以繼承他的上級的日志級別“INFO”;
沒有設(shè)置addtivity,默認(rèn)為true,將此loger的打印信息向上級(root)傳遞;
沒有設(shè)置appender,此loger本身不打印任何信息。
將root的打印級別設(shè)置為“INFO”,指定了名字為“STDOUT”的appender。
當(dāng)執(zhí)行測試方法時,因為LogbackDemo 在包com.pikaiqu.logbackdemo中,所以首先執(zhí)行,將級別為“INFO”及大于“INFO”的日志信息傳遞給root,本身并不打印;
root接到下級(即)傳遞的信息,交給已經(jīng)配置好的名為“STDOUT”的appender處理,“STDOUT”appender將信息打印到控制臺;
配置root和多個logger,指定級別,指定appender
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="false" scanPeriod="60 seconds" debug="false"><contextName>logback_demo</contextName><property name="pattern-color" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><!-- encoder 默認(rèn)配置為PatternLayoutEncoder --><encoder><pattern>${pattern-color}}</pattern></encoder></appender><logger name="com.pikaiqu.logbackdemo" ></logger><logger name="com.pikaiqu.logbackdemo.LogbackdemoApplicationTests" level="INFO" additivity="false"><appender-ref ref="STDOUT"/></logger><root level="INFO"><appender-ref ref="STDOUT" /></root></configuration>=================================輸出結(jié)果============================================
2022-04-26 15:41:08.022 [main] INFO c.pikaiqu.logbackdemo.LogbackdemoApplicationTests - ======info
2022-04-26 15:41:08.023 [main] WARN c.pikaiqu.logbackdemo.LogbackdemoApplicationTests - ======warn
2022-04-26 15:41:08.023 [main] ERROR c.pikaiqu.logbackdemo.LogbackdemoApplicationTests - ======error
將控制com.pikaiqu.logbackdemo包下的所有類的日志的打印,但是并沒用設(shè)置打印級別,所以繼承他的上級的日志級別“INFO”;
沒有設(shè)置addtivity,默認(rèn)為true,將此loger的打印信息向上級傳遞;
沒有設(shè)置appender,此loger本身不打印任何信息。
控制com.pikaiqu.logbackdemo.LogbackdemoApplicationTests類的日志打印,打印級別為“INFO”;
additivity屬性為false,表示此loger的打印信息不再向上級(即)傳遞,
使用指定了名字為“STDOUT”的appender。
將root的打印級別設(shè)置為“INFO”,指定了名字為“STDOUT”的appender。
當(dāng)執(zhí)行測試方法時,先執(zhí)行,將級別為“INFO”及大于“INFO”的日志信息交給此loger指定的名為“STDOUT”的appender處理,在控制臺中打出日志,不再向該loger的上級 傳遞打印信息;
未接到任何打印信息,當(dāng)然也不會給它的上級root傳遞任何打印信息;
如果設(shè)置,則結(jié)果如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="false" scanPeriod="60 seconds" debug="false"><contextName>logback_demo</contextName><property name="pattern-color" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><!-- encoder 默認(rèn)配置為PatternLayoutEncoder --><encoder><pattern>${pattern-color}}</pattern></encoder></appender><logger name="com.pikaiqu.logbackdemo" ></logger><logger name="com.pikaiqu.logbackdemo.LogbackdemoApplicationTests" level="INFO" additivity="true"><appender-ref ref="STDOUT"/></logger><root level="info"><appender-ref ref="STDOUT" /></root></configuration>=================================輸出結(jié)果============================================
2022-04-26 15:41:08.022 [main] INFO c.pikaiqu.logbackdemo.LogbackdemoApplicationTests - ======info
2022-04-26 15:41:08.022 [main] INFO c.pikaiqu.logbackdemo.LogbackdemoApplicationTests - ======info
2022-04-26 15:41:08.023 [main] WARN c.pikaiqu.logbackdemo.LogbackdemoApplicationTests - ======warn
2022-04-26 15:41:08.023 [main] WARN c.pikaiqu.logbackdemo.LogbackdemoApplicationTests - ======warn
2022-04-26 15:41:08.023 [main] ERROR c.pikaiqu.logbackdemo.LogbackdemoApplicationTests - ======error
2022-04-26 15:41:08.023 [main] ERROR c.pikaiqu.logbackdemo.LogbackdemoApplicationTests - ======error
將控制com.pikaiqu.logbackdemo包下的所有類的日志的打印,但是并沒用設(shè)置打印級別,所以繼承他的上級的日志級別“INFO”;
沒有設(shè)置addtivity,默認(rèn)為true,將此loger的打印信息向上級傳遞;
沒有設(shè)置appender,此loger本身不打印任何信息。
控制com.pikaiqu.logbackdemo.LogbackdemoApplicationTests類的日志打印,打印級別為“INFO”;
additivity屬性為false,表示此loger的打印信息會向上級(即)傳遞,
使用指定了名字為“STDOUT”的appender。
將root的打印級別設(shè)置為“INFO”,指定了名字為“STDOUT”的appender。
當(dāng)執(zhí)行測試方法時,先執(zhí)行,將級別為“INFO”及大于“INFO”的日志信息交給此loger指定的名為“STDOUT”的appender處理,在控制臺中打出日志。
然后向該loger的上級 傳遞打印信息;由于沒有設(shè)置appender,此loger本身不打印任何信息,而且沒有設(shè)置addtivity,則默認(rèn)為true,因此將此loger的打印信息向上級(root)傳遞。
root接到下級(即)傳遞的信息,交給已經(jīng)配置好的名為“STDOUT”的appender處理,“STDOUT”appender將信息打印到控制臺。
環(huán)境配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds"><!--配置多環(huán)境日志輸出 可以在application.properties中配置選擇哪個profiles : spring.profiles.active=dev--><!--生產(chǎn)環(huán)境:輸出到文件--><!--<springProfile name="pro"><root level="info"><appender-ref ref="DEBUG_FILE" /><appender-ref ref="INFO_FILE" /><appender-ref ref="ERROR_FILE" /><appender-ref ref="WARN_FILE" /></root></springProfile>--><!--開發(fā)環(huán)境:打印控制臺--><!--<springProfile name="dev"><root level="debug"><appender-ref ref="CONSOLE" /></root></springProfile>--></configuration>
完整的logback-spring.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設(shè)置為WARN,則低于WARN的信息都不會輸出 -->
<!-- scan:當(dāng)此屬性設(shè)置為true時,配置文件如果發(fā)生改變,將會被重新加載,默認(rèn)值為true -->
<!-- scanPeriod:設(shè)置監(jiān)測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認(rèn)單位是毫秒。當(dāng)scan為true時,此屬性生效。默認(rèn)的時間間隔為1分鐘。 -->
<!-- debug:當(dāng)此屬性設(shè)置為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài)。默認(rèn)值為false。 -->
<configuration scan="true" scanPeriod="10 seconds"><contextName>logback</contextName><!-- name的值是變量的名稱,value的值時變量定義的值。通過定義的值會被插入到logger上下文中。定義變量后,可以使“${}”來使用變量--><property name="log.path" value="F:/java基礎(chǔ)學(xué)習(xí)/復(fù)習(xí)testcode/logs" /><property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/><!--輸出到控制臺--><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><!--此日志appender是為開發(fā)使用,只配置最底級別,控制臺輸出的日志級別是大于或等于此級別的日志信息--><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>debug</level></filter><encoder><Pattern>${CONSOLE_LOG_PATTERN}</Pattern><!-- 設(shè)置字符集 --><charset>UTF-8</charset></encoder></appender><!--輸出到文件--><!-- 時間滾動輸出 level為 DEBUG 日志 --><appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在記錄的日志文件的路徑及文件名 --><!--先將今天的日志保存在這個文件中--><file>${log.path}/log_debug.log</file><!--日志文件輸出格式 %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n%d{HH: mm:ss.SSS}——日志輸出時間%thread——輸出日志的進(jìn)程名字,這在Web應(yīng)用以及異步任務(wù)處理中很有用%-5level——日志級別,并且使用5個字符靠左對齊%logger{36}——日志輸出者的名字%msg——日志消息%n——平臺的換行符--><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><charset>UTF-8</charset> <!-- 設(shè)置字符集 --></encoder><!-- 日志記錄器的滾動策略,按日期,按大小記錄 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- rollover daily --><!--如果第二天輸出日志,會將當(dāng)天的日志記錄在<file>${log.path}/log_debug.log</file>,然后將昨天的日志歸檔到下面的文件中--><!--以分鐘切分 %d{yyyy-MM-dd_HH-mm}--><fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd_HH-mm}.%i.log</fileNamePattern><!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB --><!--單個日志文件最大100M,到了這個值,就會再創(chuàng)建一個日志文件,日志文件的名字最后+1--><maxFileSize>100MB</maxFileSize><!--日志文件保留天數(shù)--><maxHistory>30</maxHistory><!--所有的日志文件最大20G,超過就會刪除舊的日志--><totalSizeCap>20GB</totalSizeCap></rollingPolicy><!--此日志文件只記錄debug級別的onMatch和onMismatch都有三個屬性值,分別為Accept、DENY和NEUTRALonMatch="ACCEPT" 表示匹配該級別及以上onMatch="DENY" 表示不匹配該級別及以上onMatch="NEUTRAL" 表示該級別及以上的,由下一個filter處理,如果當(dāng)前是最后一個,則表示匹配該級別及以上onMismatch="ACCEPT" 表示匹配該級別以下onMismatch="NEUTRAL" 表示該級別及以下的,由下一個filter處理,如果當(dāng)前是最后一個,則不匹配該級別以下的onMismatch="DENY" 表示不匹配該級別以下的--><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>debug</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!-- 時間滾動輸出 level為 INFO 日志 --><appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在記錄的日志文件的路徑及文件名 --><file>${log.path}/log_info.log</file><!--日志文件輸出格式--><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><charset>UTF-8</charset></encoder><!-- 日志記錄器的滾動策略,按日期,按大小記錄 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- rollover daily --><!--如果第二天輸出日志,會將當(dāng)天的日志記錄在<file>${log.path}/log_debug.log</file>,然后將昨天的日志歸檔到下面的文件中--><!--以分鐘切分 %d{yyyy-MM-dd_HH-mm}--><fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern><!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB --><!--單個日志文件最大100M,到了這個值,就會再創(chuàng)建一個日志文件,日志文件的名字最后+1--><maxFileSize>100MB</maxFileSize><!--日志文件保留天數(shù)--><maxHistory>30</maxHistory><!--所有的日志文件最大20G,超過就會刪除舊的日志--><totalSizeCap>20GB</totalSizeCap></rollingPolicy><!--SizeAndTimeBasedRollingPolicy配置更靈活,所以改用SizeAndTimeBasedRollingPolicy--><!--<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!– 每天日志歸檔路徑以及格式 –><fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy><!–日志文件保留天數(shù)–><maxHistory>15</maxHistory></rollingPolicy>--><!-- 此日志文件只記錄info級別的 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>info</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!-- 時間滾動輸出 level為 WARN 日志 --><appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在記錄的日志文件的路徑及文件名 --><file>${log.path}/log_warn.log</file><!--日志文件輸出格式--><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><charset>UTF-8</charset> <!-- 此處設(shè)置字符集 --></encoder><!-- 日志記錄器的滾動策略,按日期,按大小記錄 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- rollover daily --><!--如果第二天輸出日志,會將當(dāng)天的日志記錄在<file>${log.path}/log_debug.log</file>,然后將昨天的日志歸檔到下面的文件中--><!--以分鐘切分 %d{yyyy-MM-dd_HH-mm}--><fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern><!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB --><!--單個日志文件最大100M,到了這個值,就會再創(chuàng)建一個日志文件,日志文件的名字最后+1--><maxFileSize>100MB</maxFileSize><!--日志文件保留天數(shù)--><maxHistory>30</maxHistory><!--所有的日志文件最大20G,超過就會刪除舊的日志--><totalSizeCap>20GB</totalSizeCap></rollingPolicy><!-- 此日志文件只記錄warn級別的 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>warn</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!-- 時間滾動輸出 level為 ERROR 日志 --><appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在記錄的日志文件的路徑及文件名 --><file>${log.path}/log_error.log</file><!--日志文件輸出格式--><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><charset>UTF-8</charset> <!-- 此處設(shè)置字符集 --></encoder><!-- 日志記錄器的滾動策略,按日期,按大小記錄 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- rollover daily --><!--如果第二天輸出日志,會將當(dāng)天的日志記錄在<file>${log.path}/log_debug.log</file>,然后將昨天的日志歸檔到下面的文件中--><!--以分鐘切分 %d{yyyy-MM-dd_HH-mm}--><fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern><!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB --><!--單個日志文件最大100M,到了這個值,就會再創(chuàng)建一個日志文件,日志文件的名字最后+1--><maxFileSize>100MB</maxFileSize><!--日志文件保留天數(shù)--><maxHistory>30</maxHistory><!--所有的日志文件最大20G,超過就會刪除舊的日志--><totalSizeCap>20GB</totalSizeCap></rollingPolicy><!-- 此日志文件只記錄ERROR級別的 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!--root配置必須在appender下邊--><!--root節(jié)點是對所有appender的管理,添加哪個appender就會打印哪個appender的日志--><!--root節(jié)點的level是總的日志級別控制,如果appender的日志級別設(shè)定比root的高,會按照appender的日志級別打印日志,--><!--如果appender的日志級別比root的低,會按照root設(shè)定的日志級別進(jìn)行打印日志--><!--也就是說root設(shè)定的日志級別是最低限制,如果root設(shè)定級別為最高ERROR,那么所有appender只能打印最高級別的日志--><root level="INFO"><appender-ref ref="STDOUT" /><appender-ref ref="DEBUG_FILE" /><appender-ref ref="INFO_FILE" /><appender-ref ref="WARN_FILE" /><appender-ref ref="ERROR_FILE" /></root><!--name:用來指定受此loger約束的某一個包或者具體的某一個類。--><!--addtivity:是否向上級loger傳遞打印信息。默認(rèn)是true。--><logger name="com.pikaiqu.logbackdemo.LogbackdemoApplicationTests" level="debug" additivity="false"><appender-ref ref="STDOUT" /><appender-ref ref="INFO_FILE" /></logger><!--配置多環(huán)境日志輸出 可以在application.properties中配置選擇哪個profiles : spring.profiles.active=dev--><!--生產(chǎn)環(huán)境:輸出到文件--><!--<springProfile name="pro"><root level="info"><appender-ref ref="DEBUG_FILE" /><appender-ref ref="INFO_FILE" /><appender-ref ref="ERROR_FILE" /><appender-ref ref="WARN_FILE" /></root></springProfile>--><!--開發(fā)環(huán)境:打印控制臺--><!--<springProfile name="dev"><root level="debug"><appender-ref ref="STDOUT" /></root></springProfile>--></configuration>