天天看點

一文了解SpringBoot的日志管理 | 帶你讀《SpringBoot實戰教程》之七

上一篇: 玩轉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           

把這個配置放到全局配置檔案當中。

一文了解SpringBoot的日志管理 | 帶你讀《SpringBoot實戰教程》之七

輸出内容為:

一文了解SpringBoot的日志管理 | 帶你讀《SpringBoot實戰教程》之七
一文了解SpringBoot的日志管理 | 帶你讀《SpringBoot實戰教程》之七

自定義日志配置檔案

通過系統屬性和傳統的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。