SpringBoot 整合 Log4j2 日誌框架

曾是然發表於2021-01-22

前言

程式碼執行日誌對於專案來說十分重要。本文記錄的是 SpringBoot 與 Log4j2 的整合配置過程,至於其他日誌框架和 Log4j2 的對比,小夥伴們可自行查閱資料。

環境

  • JDK 8
  • Gradle 6.7

準備

排除 Logback 依賴

先排除 SpringBoot 預設使用的 Logback 日誌框架,在 build.gradle 裡新增下面的配置。

configurations {
    implementation.exclude module: 'spring-boot-starter-logging'
}

引入 Log4j2 依賴

我們採用 Log4j2 支援的 YAML 格式配置檔案,支援該格式需要加入 jackson-dataformat-yaml 依賴,詳情可查閱文件

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-log4j2'
    implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml'
}

瞭解

日誌等級

Standard Level Int Level
OFF 0
FATAL 100
ERROR 200
WARN 300
INFO 400
DEBUG 500
TRACE 600
ALL Integer.MAX_VALUE


級別從低到高分別是:ALLTRACEDEBUGINFOWARNERRORFATALOFF

但由於我們使用的是 Slf4j 門面,所以 ALLFATALOFF 級別無法使用。可閱讀文章 為什麼阿里巴巴禁止工程師直接使用日誌系統(Log4j、Logback)中的 API 瞭解日誌門面相關知識。

配置檔案結構

  • Appenders
    • Appender
      • Layout
      • Filter
      • Policy
      • Strategy
  • Loggers
    • Logger
    • RootLogger

Appender

可以理解為「管道」,控制日誌儲存的位置。下面的其它配置引數都是以 rollingFileAppender 為例。

其他 Appender 相關文件可參考:Log4j2 官方文件 Appender 部分。

Layout
引數 說明
%d 日誌時間
%level 日誌級別
%pid 程式 ID
%t 執行緒名
%c Logger 名稱
%msg 日誌文字
%n 換行符
%highlight 顏色高亮


控制日誌格式,一般採用 patternLayout

appenders:
  rollingFile:
    patternLayout:
      # 日誌格式模板
      pattern: "%d{DEFAULT} %5level %pid --- %c : %msg%n"

如果想在「控制檯」中列印出有顏色的日誌資訊,可加入 consoleAppender 後在 pattern 欄位中加入 %highlight 引數。

其他 Layout 相關文件可參考:Log4j2 官方文件 Layout 部分。

Filter

控制日誌能否進入管道,示例中採用 thresholdFilter

  appenders:
    rollingFile:
      filters:
        thresholdFilter:
          # 匹配的級別 >= info
          level: info
          onMatch: accept
          onMismatch: neutral

Filter 也可以在 Loggers 層級裡配置,詳細內容請自行參考文件。

其他 Filter 相關文件可參考:Log4j2 官方文件 Filter 部分。

Policy

控制日誌何時(when)進行歸檔。示例中採用 sizeBasedTriggeringPolicytimeBasedTriggeringPolicy

appenders:
  rollingFile:
    # 日誌歸檔檔名模板
    filePattern: log/backup/$${date:yyyy-MM}/%d{yyyy-MM-dd}_${projectName}_%i.log
    policies:
      # 日誌檔案到達 20 MB 時觸發
      sizeBasedTriggeringPolicy:
        size: 20 MB
      # 以天為單位歸檔日誌
      timeBasedTriggeringPolicy:
        interval: 1

注意 filePattern 中最小的時間單位是「天」,所以 timeBasedTriggeringPolicy.interval = 1 時,日誌將以「天」為單位進行歸檔。

其他 Policy 相關文件可參考:Log4j2 官方文件 Policy 部分。

Strategy

控制日誌如何(How)進行歸檔。示例中採用 defaultRolloverStrategy

appenders:
  rollingFile:
    defaultRolloverStrategy:
        max: 100

與上面的 Policy 配合,可以實現每天最多生成 100 個日誌檔案,如果單個日誌檔案體積已經超過 20 MB,就重新生成新的日誌檔案,並將該日誌檔案歸檔處理。單日最多可生成 100 個,由 max 引數控制。

其他 Strategy 相關文件可參考:Log4j2 官方文件 Strategy 部分。

Logger

Logger 可以理解成路由器,用來指定類或包中產生的日誌資訊進入哪個管道。

  • RootLogger(必須配置)
  • Logger

其它 Logger 相關文件可參考:Log4j2 官方文件 Logger 部分。

總結

這裡貼出一份較為完整的配置方案,供小夥伴們參考。主要實現了以下兩點功能:

  • 控制檯列印彩色日誌。
  • 以天為單位進行日誌檔案歸檔。
configuration:
  name: log4j2YamlConfig
  status: error

  # 屬性
  properties:
    property:
      name: projectName
      value: demo

  # 管道
  appenders:
    # 控制檯
    console:
      name: console
      patternLayout:
        pattern: "%d{DEFAULT} %highlight{%5level} %pid --- %highlight{%c}{STYLE=Logback} : %msg%n"

    # 滾動檔案
    rollingFile:
      name: rollingFile
      fileName: log/${projectName}.log
      filePattern: log/backup/$${date:yyyy-MM}/%d{yyyy-MM-dd}_${projectName}_%i.log
      patternLayout:
        pattern: "%d{DEFAULT} %5level %pid --- %c : %msg%n"
      policies:
        sizeBasedTriggeringPolicy:
          size: 20 MB
        timeBasedTriggeringPolicy:
          interval: 1
      defaultRolloverStrategy:
        max: 100
      filters:
        thresholdFilter:
          # 日誌級別 >= error
          level: error
          onMatch: accept
          onMismatch: deny

  # 路由
  loggers:
    root:
      # 日誌級別 >= info
      level: info
      appenderRef:
        - ref: console
        - ref: rollingFile
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Hello。

相關文章