root 節點是必選節點,用來指定最基礎的日誌輸出級別,只有一個 level 屬性,用於設置打印級別,可選以下:TRACE
,DEBUG
,INFO
,WARN
,ERROR
,ALL
,OFF
。spring
root 節點能夠包含 0 個或多個元素,將appender
添加進來。以下:緩存
<root level="debug"> <appender-ref ref="console" /> <appender-ref ref="file" /> </root>
appender 也是子節點之一,將會在後面說明。安全
用於定義變量,方便使用。有兩個屬性:name,value。定義變量後,能夠使用${}
來使用變量。以下:數據結構
<property name="path" value="./log"/> <property name="appname" value="app"/>
appender中有2個必填屬性--name和class。name爲節點的名稱,class爲的全限定類名,也就是日誌輸出目的地的處理類。其中,encoder子節點用來控制日誌的輸出格式app
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> </encoder> </appender>
appender 用來格式化日誌輸出的節點,這個最重要。有兩個屬性:框架
下面經過例子來講明這個怎麼用:異步
在logback中,主要有如下三種日誌目的地處理類:async
將日誌輸出到控制檯maven
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> </encoder> </appender>
將日誌輸出到具體的磁盤文件中,能夠單獨指定具體的位置,也能夠設置日誌的輸出格式;spring-boot
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>e:/log.out</file> <append>true</append> <prudent>false</prudent> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender>
子節點append:新增的日誌是否以追加到文件結尾的方式寫入到log.out文件中,true爲追加,fasle爲清空現存文件寫入;
子節點prudent:日誌是否被安全的寫入磁盤文件,默認爲false。若是爲true,則效率低下;
滾動記錄日誌,當符合rollingPolicy節點中設置的條件時,會將現有日誌移到新的文件中去。rollingPolicy節點中可設置的條件爲:文件的大小、時間等;
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>e:/log.out</file> <append>true</append> <prudent>false</prudent> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>testLog-%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender>
異步記錄日誌,內部經過使用緩存的方式來實現異步打印,將日誌打印事件event放入緩存中。具體數據結構爲BlockingQueue;
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>e:/log.out</file> <append>true</append> <prudent>false</prudent> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> <appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender"> <discardingThreshold>0</discardingThreshold> <queueSize>512</queueSize> <appender-ref ref ="FILE"/> </appender>
子節點queueSize:指的是BlockingQueue的隊列容量大小,默認爲256個;
子節點discardingThreshold:若是BlockingQueue中還剩餘20%的容量,那麼程序會丟棄TRACE、DEBUG和INFO級別的日誌打印事件event,只保留WARN和ERROR級別的。爲了保留全部的日誌打印事件,能夠將該值設置爲0。
日誌文件的滾動策略,與RollingFileAppender搭配使用,當日志文件發生變更時決定RollingFileAppender的行爲。在rollingPolicy節點中有一個class屬性,可選的值爲TimeBasedRollingPolicy、FixedWindowRollingPolicy、TriggeringPolicy。其中ch.qos.logback.core.rolling.TimeBasedRollingPolicy表示根據時間制定日誌文件的滾動策略;
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>testLog-%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy>
ch.qos.logback.core.rolling.FixedWindowRollingPolicy表示若是日誌文件大小超過指定範圍時,會根據文件名拆分紅多個文件;
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>tests.%i.log.zip</fileNamePattern> <minIndex>1</minIndex> <maxIndex>4</maxIndex> </rollingPolicy>
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--設置存儲路徑變量--> <property name="LOG_HOME" value="./log"/> <!--控制檯輸出appender--> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <!--設置輸出格式--> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日誌消息,%n是換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <!--設置編碼--> <charset>UTF-8</charset> </encoder> </appender> <!--文件輸出,時間窗口滾動--> <appender name="timeFileOutput" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--日誌名,指定最新的文件名,其餘文件名使用FileNamePattern --> <File>${LOG_HOME}/timeFile/out.log</File> <!--文件滾動模式--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日誌文件輸出的文件名,可設置文件類型爲gz,開啓文件壓縮--> <FileNamePattern>${LOG_HOME}/timeFile/info.%d{yyyy-MM-dd}.%i.log.gz</FileNamePattern> <!--日誌文件保留天數--> <MaxHistory>30</MaxHistory> <!--按大小分割同一天的--> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>10MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!--輸出格式--> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日誌消息,%n是換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <!--設置編碼--> <charset>UTF-8</charset> </encoder> </appender> <!-- 異步輸出 --> <appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender"> <!-- 不丟失日誌.默認的,若是隊列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日誌 --> <discardingThreshold>0</discardingThreshold> <!-- 更改默認的隊列的深度,該值會影響性能.默認值爲256 --> <queueSize>256</queueSize> <!-- 添加附加的appender,最多隻能添加一個 --> <appender-ref ref="timeFileOutput"/> </appender> <!--指定基礎的日誌輸出級別--> <root level="INFO"> <!--appender將會添加到這個loger--> <appender-ref ref="console"/> <appender-ref ref="timeFileOutput"/> </root> </configuration>
SpringBoot工程自帶logback和slf4j的依賴,因此只要在maven依賴中添加了spring-boot-starter-logging便可。logback框架會默認加載classpath下命名爲logback-spring或logback的配置文件。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency>
若是無需複雜的日誌配置,執行簡單設置日誌打印級別,打印方式可直接在 application.yml 中配置。
logging: # 配置日誌存放路徑,日誌文件名爲:spring.log path: e:/log file: # 設置日誌文件大小 max-size: 20MB level: # root日誌以info級別輸出 root: info # 此包下全部class以DEBUG級別輸出 com.demo.test: debug
Spring Boot 官方推薦優先使用帶有 -spring 的文件名做爲你的日誌配置(如使用 logback-spring.xml ,而不是 logback.xml ),命名爲 logback-spring.xml 的日誌配置文件, spring boot 能夠爲它添加一些 spring boot 特有的配置項示例以下:
<configuration> <!-- 測試環境+開發環境. 多個使用逗號隔開. --> <springProfile name="test,dev"> <logger name="com.test.demo" level="DEBUG" additivity="false"> <appender-ref ref="console"/> </logger> </springProfile> <!-- 生產環境. --> <springProfile name="prod"> <logger name="com.test.demo" level="INFO" additivity="false"> <appender-ref ref="timeFileOutput"/> </logger> </springProfile> </configuration>