上一篇: 玩轉SpringBootApplication注解 | 帶你讀《SpringBoot實戰教程》之六 下一篇: 2種loger的使用 | 帶你讀《SpringBoot實戰教程》之八 本文來自于千鋒教育在阿裡雲開發者社群學習中心上線課程《SpringBoot實戰教程》,主講人楊紅豔, 點選檢視視訊内容 。
16.SpringBoot的日志管理:
SprongBoot使用的預設日志架構是Logback,并用INFO級别輸出到控制台。
日志輸出内容元素具體如下:
• 時間日期:精确到毫秒
• 日志級别:ERROR, WARN, INFO, DEBUG or TRACE
• 程序ID
• 分隔符:— 辨別實際日志的開始
• 線程名:方括号括起來(可能會截斷控制台輸出)
• Logger名:通常使用源代碼的類名
• 日志内容
日志依賴:該依賴内容就是 Spring Boot 預設的日志架構 logback
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
實際開發中我們不需要直接添加該依賴。
SpringBoot的日志的級别有7個:
TRACE , DEBUG , INFO , WARN , ERROR , FATAL , OFF
日志級别從低到高為:
TRACE < DEBUG < INFO < WARN < ERROR < FATAL< OFF 。
如果設定為 WARN ,則低于 WARN 的資訊都不會輸出。
Spring Boot 中預設配置 ERROR 、 WARN 和 INFO 級别的日志輸出到控制台。
例如:
#root日志以WARN級别輸出
logging.level.root=WARN (讓日志隻輸出warn及以上級别的資訊)
#springframework.web日志以DEBUG級别輸出
logging.level.org.springframework.web=DEBUG
#hibernate日志以ERROR級别輸出
logging.level.org.hibernate=ERROR
預設情況下,Spring Boot将日志輸出到控制台,不會寫到日志檔案。如果要編寫除控制台輸出之外的日志檔案,則需在application.properties中設定logging.file或logging.path屬性。
- logging.file,設定檔案,可以是絕對路徑,也可以是相對路徑。如:logging.file=log/my.log(相對)或者/log/my.log(絕對)
- logging.path,設定目錄,會在該目錄下建立spring.log檔案,并寫入日志内容,如:logging.path=/var/log
如果隻配置 logging.file,會在項目的目前路徑下生成一個 xxx.log 日志檔案。
如果隻配置 logging.path,在 /var/log檔案夾生成一個日志檔案為 spring.log
注:二者不能同時使用,如若同時使用,則隻有logging.file生效
預設情況下,日志檔案的大小達到10MB時會切分一次,産生新的日志檔案,預設級别為:ERROR、WARN、INFO。
配置日志
logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.file=e:\\springboot\\info.log
logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n
logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n
把這個配置放到全局配置檔案當中。

輸出内容為:
自定義日志配置檔案
通過系統屬性和傳統的Spring Boot外部配置檔案依然可以很好的支援日志控制和管理。
根據不同的日志系統,你可以按如下規則組織配置檔案名,就能被正确加載:
- Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
- Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
- Log4j2:log4j2-spring.xml, log4j2.xml
- JDK (Java Util Logging):logging.properties
Spring Boot官方推薦優先使用帶有-spring的檔案名作為你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名為logback-spring.xml的日志配置檔案,spring boot可以為它添加一些spring boot特有的配置項。
如果你既想完全掌控日志配置,但又不想用logback.xml作為Logback配置的名字,可以通過logging.config屬性指定自定義的名字:
logging.config=classpath:logging-config.xml
雖然一般并不需要改變配置檔案的名字,但是如果你想針對不同運作時Profile使用不同的日志配置,這個功能會很有用。
建立一個配置檔案:logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>
<property name="log.path" value="E:\\springboot\\info.log" />
<!--輸出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>-->
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!--輸出到檔案-->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logback.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
<!-- logback為java中的包 -->
<logger name="com.qianfeng.controller"/>
<!--additivity是否向上級loger傳遞列印資訊-->
<logger name="com.qianfeng.controller.SpringController" level="WARN" additivity="false">
<appender-ref ref="console"/>
</logger>
</configuration>
根節點
<configuration>
包含的屬性:
- scan:當此屬性設定為true時,配置檔案如果發生改變,将會被重新加載,預設值為true。
- scanPeriod:設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間機關,預設機關是毫秒。當scan為true時,此屬性生效。預設的時間間隔為1分鐘。
- debug:當此屬性設定為true時,将列印出logback内部日志資訊,實時檢視logback運作狀态。預設值為false。
<contextname>
:每個logger都關聯到logger上下文,預設上下文名稱為“default”。但可以使用設定成其他名字,用于區分不同應用程式的記錄。一旦設定,不能修改,可以通過%contextName來列印日志上下文名稱。
<property>
:用來定義變量值的标簽, 有兩個屬性,name和value;其中name的值是變量的名稱,value的值時變量定義的值。通過定義的值會被插入到logger上下文中。定義變量後,可以使“${}”來使用變量。
<appender>
:用來格式化日志輸出節點,有兩個屬性name和class,class用來指定哪種輸出政策,常用就是控制台輸出政策和檔案輸出政策。
ThresholdFilter
為系統定義的攔截器,例如我們用ThresholdFilter來過濾掉ERROR級别以下的日志不輸出到檔案中。如果不用記得注釋掉,不然你控制台會發現沒日志。
RollingFileAppender用于切分檔案日志:
<fileNamePattern>logback.%d{yyyy-MM-dd}.log</fileNamePattern>
:定義了日志的切分方式——把每一天的日志歸檔到一個檔案中。
<maxHistory>30</maxHistory>
:表示隻保留最近30天的日志,以防止日志填滿整個磁盤空間。同理,可以使用%d{yyyy-MM-dd_HH-mm}來定義精确到分的日志切分方式。
<totalSizeCap>1GB</totalSizeCap>
:用來指定日志檔案的上限大小,例如設定為1GB的話,那麼到了這個值,就會删除舊的日志。
<root>
節點是必選節點,用來指定最基礎的日志輸出級别,隻有一個level屬性。
<loger>
用來設定某一個包或者具體的某一個類的日志列印級别、以及指定
<appender>
<loger>
僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。
- name:用來指定受此loger限制的某一個包或者具體的某一個類。
- level:用來設定列印級别,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級别。如果未設定此屬性,那麼目前loger将會繼承上級的級别。
- addtivity:是否向上級loger傳遞列印資訊。預設是true。