SpringBoot 整合 Log4j2 日志框架

前言

代码运行日志对于项目来说十分重要。本文记录的是 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。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!