SpringBoot 整合 Log4j2 日志框架

前言

代碼運行日志對于項目來說十分重要。本文記錄的是 SpringBoot 與 Log4j2 的整合配置過程,至于其他日志框架和 Log4j2 的對比,小伙伴們可自行查閱資料。

環(huán)境

  • JDK 8
  • Gradle 6.7

準(zhǔn)備

排除 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


級別從低到高分別是:ALL、TRACE、DEBUGINFO、WARNERRORFATAL、OFF

但由于我們使用的是 Slf4j 門面,所以 ALLFATALOFF 級別無法使用。可閱讀文章 為什么阿里巴巴禁止工程師直接使用日志系統(tǒng)(Log4j、Logback)中的 API 了解日志門面相關(guān)知識。

配置文件結(jié)構(gòu)

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

Appender

可以理解為「管道」,控制日志保存的位置。下面的其它配置參數(shù)都是以 rollingFileAppender 為例。

其他 Appender 相關(guān)文檔可參考:Log4j2 官方文檔 Appender 部分。

Layout
參數(shù) 說明
%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 參數(shù)。

其他 Layout 相關(guān)文檔可參考:Log4j2 官方文檔 Layout 部分。

Filter

控制日志能否進入管道,示例中采用 thresholdFilter。

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

Filter 也可以在 Loggers 層級里配置,詳細內(nèi)容請自行參考文檔。

其他 Filter 相關(guān)文檔可參考:Log4j2 官方文檔 Filter 部分。

Policy

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

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

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

其他 Policy 相關(guān)文檔可參考:Log4j2 官方文檔 Policy 部分。

Strategy

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

appenders:
  rollingFile:
    defaultRolloverStrategy:
        max: 100

與上面的 Policy 配合,可以實現(xiàn)每天最多生成 100 個日志文件,如果單個日志文件體積已經(jīng)超過 20 MB,就重新生成新的日志文件,并將該日志文件歸檔處理。單日最多可生成 100 個,由 max 參數(shù)控制。

其他 Strategy 相關(guān)文檔可參考:Log4j2 官方文檔 Strategy 部分。

Logger

Logger 可以理解成路由器,用來指定類或包中產(chǎn)生的日志信息進入哪個管道。

  • RootLogger(必須配置)
  • Logger

其它 Logger 相關(guān)文檔可參考:Log4j2 官方文檔 Logger 部分。

總結(jié)

這里貼出一份較為完整的配置方案,供小伙伴們參考。主要實現(xiàn)了以下兩點功能:

  • 控制臺打印彩色日志。
  • 以天為單位進行日志文件歸檔。
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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容