1. 程式人生 > >深入Spring Boot (五):日誌使用詳解

深入Spring Boot (五):日誌使用詳解

Spring Boot內部使用Commons Logging記錄所有日誌,它支援使用Java Util Logging、Log4J2和Logback日誌工具,併為它們提供了預設配置,預設配置情況下日誌只會輸出到控制檯,當然也可以修改配置將日誌輸出到檔案。

本篇內容基於Spring Boot 2.0版本,將詳細介紹Spring Boot對日誌工具使用的支援,主要包含以下6部分內容:

  1. 預設日誌配置;
  2. 日誌輸出到檔案;
  3. 日誌檔案大小;
  4. 修改日誌級別;
  5. 自定義日誌工具;
  6. 配置檔案優先順序。

1.預設日誌配置

如果專案使用Starters,則預設使用Logback作為日誌記錄工具,並且預設配置下日誌只會在控制檯輸出,例如如下一行日誌記錄資訊:

2018-03-06 20:00:01.801  INFO 22532 --- [main] com.example.PropertiesTest : Started PropertiesTest in 2.422 seconds (JVM running for 5.826)

這行日誌資訊是按照一定格式輸出,具體格式內容包含以下元素:

  • 日期和時間:精確到毫秒;
  • 日誌級別:標識輸出的日誌級別,如ERROR、WARN、INFO、DEBUG或TRACE,需要注意的是Logback沒有FATAL級別,配置時可以配置成ERROR;
  • 程序ID,如22532;
  • —:分隔符,用於標識實際日誌記錄的開始位置;
  • 執行緒名:被顯示在方括號內,如[main];
  • Logger名:通常是源類名;
  • 冒號分隔符;
  • 日誌資訊。

預設配置下,日誌將記錄ERROR、WARN和INFO級別的日誌資訊。當然你也可以開啟除錯模式記錄更多資訊,有兩種方法:

  1. 命令列啟動應用時指定開啟除錯模式,例如如下命令列:java -jar test.jar –debug;
  2. 在application.properties中配置debug=true,或在application.yml中配置debug:true;需要注意的是開啟除錯模式並不是改變日誌記錄的級別為DEBUG!

2.日誌輸出到檔案

在實際的專案開發中需要將日誌資訊記錄到檔案中,以便儲存和查詢問題。可以在application.properties中配置logging.file屬性,用於指定日誌檔案的位置(可以是相對位置或絕對位置)和名稱,它將會把日誌資訊記錄到對應位置下的日誌檔案中,例如配置logging.file=app.log,將會在當前classpath下建立app.log,並將日誌資訊記錄到這個檔案中。這個日誌檔案配置同樣可以配置在application.yml中。

也可以在application.properties中配置logging.path屬性,用於指定日誌檔案的位置,可以是相對位置或絕對位置 ,同時生成的日誌檔名稱固定為spring.log,例如配置logging.path=/logs,將會在根目錄下建立logs目錄,並生成spring.log日誌檔案,日誌資訊記錄到這個檔案中。這個日誌檔案位置配置同樣可以配置在application.yml中。

本以為Spring Boot的這兩個屬性配置是可以配合使用,實驗發現並不能。如果同時配置了logging.file和logging.path,最終生效的只是logging.file。

3.日誌檔案大小

指定日誌資訊輸出到檔案後,預設情況下使用Logback作為日誌記錄工具,會記錄ERROR、WARN和INFO級別的日誌資訊,並且日誌檔案大小超過10MB後,日誌檔案將會被打包成.gz的壓縮檔案,且壓縮檔名稱會排序累加,例如app.log.2018-03-06.0.gz、app.log.2018-03-06.1.gz。

當然也可以修改日誌檔案最大大小,通過在application.properties中配置logging.file.max-size,例如配置最大大小為100MB,則logging.file.max-size=100MB,這裡需要注意的是這個屬性配置僅對預設Logback生效,檢視原始碼可以得到驗證,具體原始碼如下圖所示。
這裡寫圖片描述
還需要注意的是,logging.file.max-size屬性值需要帶單位,可以是KB、MB或GB,單位大小寫不敏感都可以使用,檢視原始碼可以得到驗證,具體原始碼如下圖所示。
這裡寫圖片描述
還有一個Logback的專有屬性配置logging.file.max-history,用於配置儲存存檔日誌檔案的最大值。

4.修改日誌級別

修改日誌記錄的級別可以在application.properties或application.yml中配置,新增logging.level.=,其中level可以是TRACE、DEBUG、INFO、WARN、ERROR、FATAL或OFF,對於root級的配置可以使用logging.level.root,下面是一些配置示例:

logging.level.root=INFO
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR

5.自定義日誌工具

Spring Boot 2.0版本支援Java Util Logging、Log4J2和Logback日誌工具,預設使用Logback,如果不想使用預設日誌工具,可以通過如下步驟自定義日誌工具,例如使用Log4J2作為日誌工具:
(一) 將Log4J2的相關jar包新增到classpath目錄下。可以使用spring-boot-starter-log4j2來新增jar,不過需要注意的是spring-boot-starter和spring-boot-starter-web會包含預設的Logback的jar,所以新增依賴時需要排除掉這些包含的jar,對應Gradle的構建檔案程式碼如下:

dependencies {
    compile("org.springframework.boot:spring-boot-starter:2.0.0.RELEASE"){
        exclude module: 'spring-boot-starter-logging'
    }
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-log4j2', version: '2.0.0.RELEASE'
    testCompile("org.springframework.boot:spring-boot-starter-test:2.0.0.RELEASE")
}
configurations {
    all*.exclude module: 'spring-boot-starter-logging'
    all*.exclude module: 'logback-classic'
    all*.exclude module: 'log4j-over-slf4j'
}

(二) 在classpath目錄下建立log4j2-spring.xml或log4j2.xml日誌配置檔案,Spring Boot推薦使用帶有-spring的檔名作為日誌配置檔名。如果不想在classpath目錄下建立log4j2-spring.xml或log4j2.xml日誌配置檔案,還可以通過在application.properties中配置logging.config屬性來指定日誌配置檔案。示例是在classpath目錄下建立log4j2-spring.xml檔案,具體程式碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
    <appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </appenders>
    <loggers>
        <root level="trace">
            <appender-ref ref="Console"/>
        </root>
    </loggers>
</configuration>

完成上面的兩個步驟就可以使用log4j2作為日誌工具了。

當然,你也可以強制讓Spring Boot使用某一個特定的日誌工具,通過配置一個系統屬性,屬性的key為org.springframework.boot.logging.LoggingSystem,value是LoggingSystem子類的全限定名,例如Log4J2LoggingSystem,或者直接將value設定為none來禁止Spring Boot的日誌預設配置。

同樣的方法也可以使用JDK (Java Util Logging)作為日誌工具,它的日誌配置檔名為logging.properties。如果想自定義Logback的日誌配置檔案,Spring Boot支援載入logback-spring.xml、logback-spring.groovy、logback.xml或logback.groovy,不過推薦使用logback-spring.xml。

6.多環境支援

使用Logback作為日誌工具,Spring Boot對它支援了多環境切換。可以在logback-spring.xml中使用標籤來區分日誌配置對哪個環境生效,例如如下配置程式碼:

<springProfile name="dev">
    <!-- 當dev環境的profiles生效時,這部分配置生效 -->
</springProfile>
<springProfile name="dev, test">
    <!-- 當dev或test環境的profiles生效時,這部分配置生效 -->
</springProfile>
<springProfile name="!prod">
    <!-- 當非prod環境的profiles生效時,這部分配置生效 -->
</springProfile>