1. 程式人生 > >SpringBoot 日誌框架

SpringBoot 日誌框架

預設的日誌框架 logback

SpringBoot使用Logback作為預設的日誌框架。logback 是log4j框架的作者開發的新一代日誌框架,它效率更高、能夠適應諸多的執行環境,同時天然支援SLF4J。spring-boot-starter 其中包含了 spring-boot-starter-logging,該依賴內容就是 Spring Boot 預設的日誌框架 logback。

預設logback日誌列印效果圖

從上圖可以看到,日誌輸出內容元素如下

  • 時間日期 :精確到毫秒
  • 日誌級別 :ERROR, WARN, INFO, DEBUG or TRACE
  • 程序ID
  • 分隔符 :--- 標識實際日誌的開始
  • 執行緒名 :方括號括起來(可能會截斷控制檯輸出
  • Logger名 :通常使用原始碼的類名

logback 基本配置

Spting-Boot 預設整合的 logback 雖然列印些日誌資訊,但是不夠友好。滿足不了我們日常開發需求。因此,我們可以在根目錄下建立 logback.xml 或 logback-spring.xml (建議命名)檔案,進行自定義配置(In a Spring Boot application, you can specify a Logback XML configuration file as logback.xml or logback-spring.xml in the project classpath. The Spring Boot team however recommends using the -spring variant for your logging configuration, logback-spring.xml is preferred over logback.xml. If you use the standard logback.xml configuration, Spring Boot may not be able to completely control log initialization.)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!-- 控制檯輸出  start -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder charset="UTF-8">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</
pattern> </encoder> </appender> <!-- 控制檯輸出 end --> <!-- 檔案日誌輸出 start --> <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>D://logs/demo_info.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>D://logs/demo_info.%d{yyyy-MM-dd}-%i.log</fileNamePattern> <maxHistory>30</maxHistory> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <MaxFileSize>50MB</MaxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 檔案日誌輸出 end --> <!-- 異常日誌輸出 start --> <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>D://logs/demo_error.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>D://logs/demo_error.%d{yyyy-MM-dd}-%i.log</fileNamePattern> <maxHistory>30</maxHistory> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <MaxFileSize>50MB</MaxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} #### %msg%n</pattern> </encoder> </appender> <!-- 異常日誌輸出 end --> <!--列印info級別的日誌,注意,additivity必須是false--> <logger name="monitorLog" level="info" additivity="false"> <appender-ref ref="INFO" /> </logger> <!--列印異常錯誤日誌,注意,additivity必須是false--> <logger name="errorLog" level="error" additivity="false"> <appender-ref ref="ERROR" /> </logger> <!--還可以根據業務需要配置其他的logger--> <!--實際專案中我們通常將不同的日誌列印到不同的日誌檔案中--> <root level="debug"> <appender-ref ref="STDOUT" /> </root> </configuration>

日誌級別

預設情況下,Spring Boot 配置 ERROR, WARN, INFO 三種日誌級別。如果需要 Debug 級別的日誌。在 src/main/resources/application.properties 中配置資料來源資訊。

debug=true

此外,配置 logging.level.* 來具體輸出哪些包的日誌級別。

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

日誌檔案

預設情況下, Spring Boot 日誌只會輸出到控制檯,並不會寫入到日誌檔案,因此,對於正式環境的應用,我們需要通過在 application.properites 檔案中配置 logging.file 檔名稱和 logging.path 檔案路徑,將日誌輸出到日誌檔案中。

logging.path = /var/tmp
logging.file = xxx.log
logging.level.root = info

如果只配置 logging.path,在 /var/tmp資料夾生成一個日誌檔案為 spring.log。如果只配置 logging.file,會在專案的當前路徑下生成一個 xxx.log 日誌檔案。

值得注意的是,日誌檔案會在 10MB 大小的時候被截斷,產生新的日誌檔案 

常用的日誌框架 log4j

 如果,我們希望使用 log4j 或者 log4j2,我們可以採用類似的方式將它們對應的依賴模組加到 Maven 依賴中。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j</artifactId>
</dependency>

或者

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

log4j 依賴模組加到 Maven 依賴中後,在 src/main/resources 目錄下加入 log4j-spring.properties 配置檔案。Spring Boot 官方推薦優先使用帶有 –spring 的檔名作為你的日誌配置, 例如 log4j-spring.properties,當然使用 log4j.properties 也是支援的。