SpringBoot 日志的配置及輸出應用教程

默認配置

Spring Boot 默認使用 SLF4J+Logback 記錄日志,並提供瞭默認配置,即使我們不進行任何額外配,也可以使用 SLF4J+Logback 進行日志輸出。

常見的日志配置包括日志級別、日志的輸入出格式等內容。

日志級別

日志的輸出都是分級別的,當一條日志信息的級別大於或等於配置文件的級別時,就對這條日志進行記錄。

常見的日志級別如下(優先級依次升高)。

序號 日志級別 說明
1 trace 追蹤,指明程序運行軌跡。
2 debug 調試,實際應用中一般將其作為最低級別,而 trace 則很少使用。
3 info 輸出重要的信息,使用較多。
4 warn 警告,使用較多。
5 error 錯誤信息,使用較多。

輸出格式

我們可以通過以下常用日志參數對日志的輸出格式進行修改,如下表。

序號 輸出格式 說明
1 %d{yyyy-MM-dd HH:mm:ss, SSS}  日志生產時間,輸出到毫秒的時間
2 %-5level  輸出日志級別,-5 表示左對齊並且固定輸出 5 個字符,如果不足在右邊補 0
3 %logger 或 %c  logger 的名稱
4  %thread  或 %t 輸出當前線程名稱
5 %p 日志輸出格式
6 %message 或 %msg 或 %m 日志內容,即 logger.info(“message”)
7 %n 換行符
8 %class 或 %C 輸出 Java 類名
9  %file 或 %F 輸出文件名
10 %L 輸出錯誤行號
11 %method 或 %M 輸出方法名
12 %l  輸出語句所在的行數, 包括類名、方法名、文件名、行數
13 hostName 本地機器名
14 hostAddress 本地 ip 地址

示例 1

下面我們通過一個實例,來查看 Spring Boot 提供瞭哪些默認日志配置。

1. 在 Spring Boot 中編寫 Java 測試類,代碼如下。

package net.biancheng.www;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootLoggingApplicationTests {
    Logger logger = LoggerFactory.getLogger(getClass());
    /**
     * 測試日志輸出
     * SLF4J 日志級別從小到大trace>debug>info>warn>error
     */
    @Test
    void logTest() {
        //日志級別 由低到高
        logger.trace("trace 級別日志");
        logger.debug("debug 級別日志");
        logger.info("info 級別日志");
        logger.warn("warn 級別日志");
        logger.error("error 級別日志");
    }
}

2. 執行該測試,控制臺輸出如下圖。

圖1:Spring Boot 日志級別

通過控制臺輸出結果可知,Spring Boot 日志默認級別為 info,日志輸出內容默認包含以下元素:

  • 時間日期
  • 日志級別
  • 進程 ID
  • 分隔符:—
  • 線程名:方括號括起來(可能會截斷控制臺輸出)
  • Logger 名稱
  • 日志內容

修改默認日志配置

我們可以根據自身的需求,通過全局配置文件(application.properties/yml)修改 Spring Boot 日志級別和顯示格式等默認配置。

 在 application.properties 中,修改 Spring Boot 日志的默認配置,代碼如下。

#日志級別
logging.level.net.biancheng.www=trace
#使用相對路徑的方式設置日志輸出的位置(項目根目錄目錄\my-log\mylog\spring.log)
#logging.file.path=my-log/myLog
#絕對路徑方式將日志文件輸出到 【項目所在磁盤根目錄\springboot\logging\my\spring.log】
logging.file.path=/spring-boot/logging
#控制臺日志輸出格式
logging.pattern.console=%d{yyyy-MM-dd hh:mm:ss} [%thread] %-5level %logger{50} - %msg%n
#日志文件輸出格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} === - %msg%n

執行測試代碼,執行結果如下。

圖2:Spring Boot 日志修改默認配置

從圖 2 可以看到,控制臺中日志的輸出格式與 application.properties 中的 logging.pattern.console 配置一致。

查看本地日志文件 spring.log,該文件日志輸出內容如下圖。

圖3:本地日志文件 spring.log

從圖 3 可以看到,本地日志文件中的日志輸出格式與 application.properties 中 logging.pattern.file 配置一致。

自定義日志配置

在 Spring Boot 的配置文件 application.porperties/yml 中,可以對日志的一些默認配置進行修改,但這種方式隻能修改個別的日志配置,想要修改更多的配置或者使用更高級的功能,則需要通過日志實現框架自己的配置文件進行配置。

Spring 官方提供瞭各個日志實現框架所需的配置文件,用戶隻要將指定的配置文件放置到項目的類路徑下即可。

日志框架 配置文件
Logback logback-spring.xml、logback-spring.groovy、logback.xml、logback.groovy
Log4j2 log4j2-spring.xml、log4j2.xml
JUL (Java Util Logging) logging.properties

從上表可以看出,日志框架的配置文件基本上被分為 2 類:

  • 普通日志配置文件,即不帶 srping 標識的配置文件,例如 logback.xml;
  • 帶有 spring 表示的日志配置文件,例如 logback-spring.xml。

這兩種日志配置文件在使用時大不相同,下面我們就對它們分別進行介紹。

普通日志配置文件

我們將 logback.xml、log4j2.xml 等不帶 spring 標識的普通日志配置文件,放在項目的類路徑下後,這些配置文件會跳過 Spring Boot,直接被日志框架加載。通過這些配置文件,我們就可以達到自定義日志配置的目的。

示例

1. 將 logback.xml 加入到 Spring Boot 項目的類路徑下(resources 目錄下),該配置文件配置內容如下。

<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:當此屬性設置為true時,配置文件如果發生改變,將會被重新加載,默認值為true。
scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒當scan為true時,此屬性生效。默認的時間間隔為1分鐘。
debug:當此屬性設置為true時,將打印出logback內部日志信息,實時查看logback運行狀態。默認值為false。
-->
<configuration scan="false" scanPeriod="60 seconds" debug="false">
    <!-- 定義日志的根目錄 -->
    <property name="LOG_HOME" value="/app/log"/>
    <!-- 定義日志文件名稱 -->
    <property name="appName" value="bianchengbang-spring-boot-logging"></property>
    <!-- ch.qos.logback.core.ConsoleAppender 表示控制臺輸出 -->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!--
        日志輸出格式:
   %d表示日期時間,
   %thread表示線程名,
   %-5level:級別從左顯示5個字符寬度
   %logger{50} 表示logger名字最長50個字符,否則按照句點分割。
   %msg:日志消息,
   %n是換行符
        -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread]**************** %-5level %logger{50} - %msg%n</pattern>
        </layout>
    </appender>
    <!-- 滾動記錄文件,先將日志記錄到指定文件,當符合某個條件時,將日志記錄到其他文件 -->
    <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 指定日志文件的名稱 -->
        <file>${LOG_HOME}/${appName}.log</file>
        <!--
        當發生滾動時,決定 RollingFileAppender 的行為,涉及文件移動和重命名
        TimeBasedRollingPolicy: 最常用的滾動策略,它根據時間來制定滾動策略,既負責滾動也負責出發滾動。
        -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--
            滾動時產生的文件的存放位置及文件名稱 %d{yyyy-MM-dd}:按天進行日志滾動
            %i:當文件大小超過maxFileSize時,按照i進行文件滾動
            -->
            <fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!--
            可選節點,控制保留的歸檔文件的最大數量,超出數量就刪除舊文件。假設設置每天滾動,
            且maxHistory是365,則隻保存最近365天的文件,刪除之前的舊文件。註意,刪除舊文件是,
            那些為瞭歸檔而創建的目錄也會被刪除。
            -->
            <MaxHistory>365</MaxHistory>
            <!--
            當日志文件超過maxFileSize指定的大小是,根據上面提到的%i進行日志文件滾動 註意此處配置SizeBasedTriggeringPolicy是無法實現按文件大小進行滾動的,必須配置timeBasedFileNamingAndTriggeringPolicy
            -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 日志輸出格式: -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [ %thread ] ------------------ [ %-5level ] [ %logger{50} : %line ] -
                %msg%n
            </pattern>
        </layout>
    </appender>
    <!--
  logger主要用於存放日志對象,也可以定義日志類型、級別
  name:表示匹配的logger類型前綴,也就是包的前半部分
  level:要記錄的日志級別,包括 TRACE < DEBUG < INFO < WARN < ERROR
  additivity:作用在於children-logger是否使用 rootLogger配置的appender進行輸出,
  false:表示隻用當前logger的appender-ref,true:
  表示當前logger的appender-ref和rootLogger的appender-ref都有效
    -->
    <!-- hibernate logger -->
    <logger name="net.biancheng.www" level="debug"/>
    <!-- Spring framework logger -->
    <logger name="org.springframework" level="debug" additivity="false"></logger>
    <!--
    root與logger是父子關系,沒有特別定義則默認為root,任何一個類隻會和一個logger對應,
    要麼是定義的logger,要麼是root,判斷的關鍵在於找到這個logger,然後判斷這個logger的appender和level。
    -->
    <root level="info">
        <appender-ref ref="stdout"/>
        <appender-ref ref="appLogAppender"/>
    </root>
</configuration>

2. 啟動該項目並啟動測試程序,結果如下。

. ____ _ __ _ _

/\\ / ___’_ __ _ _(_)_ __ __ _ \ \ \ \

( ( )\___ | ‘_ | ‘_| | ‘_ \/ _` | \ \ \ \

\\/ ___)| |_)| | | | | || (_| | ) ) ) )

‘ |____| .__|_| |_|_| |_\__, | / / / /

=========|_|==============|___/=/_/_/_/

:: Spring Boot :: (v2.5.0)

2021-05-24 14:51:11 [main]**************** INFO n.biancheng.www.SpringBootLoggingApplicationTests – Starting SpringBootLoggingApplicationTests using Java 1.8.0_131 on LAPTOP-C67MRMAG with PID 20080 (started by 79330 in D:\eclipse workSpace4\spring-boot-logging)

2021-05-24 14:51:11 [main]**************** DEBUG n.biancheng.www.SpringBootLoggingApplicationTests – Running with Spring Boot v2.5.0, Spring v5.3.7

2021-05-24 14:51:11 [main]**************** INFO n.biancheng.www.SpringBootLoggingApplicationTests – The following profiles are active: dev

2021-05-24 14:51:13 [main]**************** INFO n.biancheng.www.SpringBootLoggingApplicationTests – Started SpringBootLoggingApplicationTests in 2.058 seconds (JVM running for 3.217)

2021-05-24 14:51:13 [main]**************** DEBUG n.biancheng.www.SpringBootLoggingApplicationTests – debug 級別日志

2021-05-24 14:51:13 [main]**************** INFO n.biancheng.www.SpringBootLoggingApplicationTests – info 級別日志

2021-05-24 14:51:13 [main]**************** WARN n.biancheng.www.SpringBootLoggingApplicationTests – warn 級別日志

2021-05-24 14:51:13 [main]**************** ERROR n.biancheng.www.SpringBootLoggingApplicationTests – error 級別日志

帶有 spring 標識的日志配置文件

Spring Boot 推薦用戶使用 logback-spring.xml、log4j2-spring.xml 等這種帶有 spring 標識的配置文件。這種配置文件被放在項目類路徑後,不會直接被日志框架加載,而是由 Spring Boot 對它們進行解析,這樣就可以使用 Spring Boot 的高級功能 Profile,實現在不同的環境中使用不同的日志配置。

示例

1. 將 logback.xml 文件名修改為 logback-spring.xml,並將配置文件中日志輸出格式的配置修改為使用 Profile 功能的配置。

2. 配置內容修改前,日志輸出格式配置如下。 

<configuration scan="false" scanPeriod="60 seconds" debug="false">
    ......
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread]**************** %-5level %logger{50} - %msg%n</pattern>
        </layout>
    </appender>
    ......
</configuration> 

3. 修改 logback-spring.xml 的配置內容,通過 Profile 功能實現在不同的環境中使用不同的日志輸出格式,配置如下。

<configuration scan="false" scanPeriod="60 seconds" debug="false">
    ......
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
       <layout class="ch.qos.logback.classic.PatternLayout">
            <!--開發環境 日志輸出格式-->
            <springProfile name="dev">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern>
            </springProfile>
            <!--非開發環境 日志輸出格式-->
            <springProfile name="!dev">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern>
            </springProfile>
        </layout>
    </appender>
    ......
</configuration> 

4. 在 Spring Boot 項目的 application.yml 中,激活開發環境(dev)的 Profile,配置內容如下。

#默認配置
server:
  port: 8080
#切換配置
spring:
  profiles:
    active: dev
---
#開發環境
server:
  port: 8081
spring:
  config:
    activate:
      on-profile: dev
---
#測試環境
server:
  port: 8082
spring:
  config:
    activate:
      on-profile: test
---
#生產環境
server:
  port: 8083
spring:
  config:
    activate:
      on-profile: prod

5. 啟動 Spring Boot 並執行測試代碼,控制臺輸出如下。

圖4:dev 環境日志輸出結果

 6. 修改 appplication.yml 中的配置,激活測試環境(test)的 Profile,配置如下。

#默認配置
server:
  port: 8080
#切換配置
spring:
  profiles:
    active: test
---
#開發環境
server:
  port: 8081
spring:
  config:
    activate:
      on-profile: dev
---
#測試環境
server:
  port: 8082
spring:
  config:
    activate:
      on-profile: test
---
#生產環境
server:
  port: 8083
spring:
  config:
    activate:
      on-profile: prod

7. 重啟 Spring Boot 並執行測試代碼,控制臺輸出如下。

圖5:test 環境日志輸出結果 

到此這篇關於SpringBoot 日志的配置及輸出應用教程的文章就介紹到這瞭,更多相關SpringBoot 日志配置及輸出內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: