1
头图

前言

代码运行日志对于项目来说十分重要。本文记录的是 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 LevelInt Level
OFF0
FATAL100
ERROR200
WARN300
INFO400
DEBUG500
TRACE600
ALLInteger.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线程名
%cLogger 名称
%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: application

  # 管道
  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/%d{yyyy-MM-dd}-%i-${projectName}.log
      patternLayout:
        pattern: "%d{DEFAULT} %5level %pid --- %c : %msg%n"
      policies:
        sizeBasedTriggeringPolicy:
          size: 20 MB
        timeBasedTriggeringPolicy:
          interval: 1
      defaultRolloverStrategy:
        max: 30
      filters:
        thresholdFilter:
          # 日志级别 >= warn
          level: warn
          onMatch: accept
          onMismatch: deny

  # 路由
  loggers:
    root:
      # 日志级别 >= info
      level: info
      appenderRef:
        - ref: console
        - ref: rollingFile

详细版

configuration:
  name: log4j2YamlConfig
  status: error

  # 属性
  properties:
    property:
      - name: level
        value: info
      - name: projectName
        value: application
      - name: rollingFile.policies.sizeBasedTriggeringPolicy.size
        value: 20 MB
      - name: rollingFile.policies.timeBasedTriggeringPolicy.interval
        value: 1
      - name: rollingFile.defaultRolloverStrategy
        value: 30
      - name: rollingFile.fileName
        value: log/${projectName}
      - name: rollingFile.filePattern
        value: log/backup/%d{yyyy-MM-dd}-%i-${projectName}
      - name: rollingFile.patternLayout.pattern
        value: "%d{DEFAULT} %5level %pid --- %c : %msg%n"

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

    # 滚动文件
    rollingFile:
      - name: debugRollingFile
        fileName: ${rollingFile.fileName}-debug.log
        filePattern: ${rollingFile.filePattern}-debug.log
        patternLayout:
          pattern: ${rollingFile.patternLayout.pattern}
        policies:
          sizeBasedTriggeringPolicy:
            size: ${rollingFile.policies.sizeBasedTriggeringPolicy.size}
          timeBasedTriggeringPolicy:
            interval: ${rollingFile.policies.timeBasedTriggeringPolicy.interval}
        defaultRolloverStrategy:
          max: ${rollingFile.defaultRolloverStrategy}
        filters:
          # 只接收 debug 级别日志
          thresholdFilter:
            - level: info
              onMatch: deny
              onMismatch: neutral
            - level: debug
              onMatch: accept
              onMismatch: deny
      - name: infoRollingFile
        fileName: ${rollingFile.fileName}-info.log
        filePattern: ${rollingFile.filePattern}-info.log
        patternLayout:
          pattern: ${rollingFile.patternLayout.pattern}
        policies:
          sizeBasedTriggeringPolicy:
            size: ${rollingFile.policies.sizeBasedTriggeringPolicy.size}
          timeBasedTriggeringPolicy:
            interval: ${rollingFile.policies.timeBasedTriggeringPolicy.interval}
        defaultRolloverStrategy:
          max: ${rollingFile.defaultRolloverStrategy}
        filters:
          # 只接收 info 级别日志
          thresholdFilter:
            - level: warn
              onMatch: deny
              onMismatch: neutral
            - level: info
              onMatch: accept
              onMismatch: deny
      - name: warnRollingFile
        fileName: ${rollingFile.fileName}-warn.log
        filePattern: ${rollingFile.filePattern}-warn.log
        patternLayout:
          pattern: ${rollingFile.patternLayout.pattern}
        policies:
          sizeBasedTriggeringPolicy:
            size: ${rollingFile.policies.sizeBasedTriggeringPolicy.size}
          timeBasedTriggeringPolicy:
            interval: ${rollingFile.policies.timeBasedTriggeringPolicy.interval}
        defaultRolloverStrategy:
          max: ${rollingFile.defaultRolloverStrategy}
        filters:
          # 只接收 warn 级别日志
          thresholdFilter:
            - level: error
              onMatch: deny
              onMismatch: neutral
            - level: warn
              onMatch: accept
              onMismatch: deny
      - name: errorRollingFile
        fileName: ${rollingFile.fileName}-error.log
        filePattern: ${rollingFile.filePattern}-error.log
        patternLayout:
          pattern: ${rollingFile.patternLayout.pattern}
        policies:
          sizeBasedTriggeringPolicy:
            size: ${rollingFile.policies.sizeBasedTriggeringPolicy.size}
          timeBasedTriggeringPolicy:
            interval: ${rollingFile.policies.timeBasedTriggeringPolicy.interval}
        defaultRolloverStrategy:
          max: ${rollingFile.defaultRolloverStrategy}
        filters:
          # 只接收 error 级别日志
          thresholdFilter:
            - level: error
              onMatch: accept
              onMismatch: deny

  # 路由
  loggers:
    root:
      level: ${level}
      appenderRef:
        - ref: console
        - ref: debugRollingFile
        - ref: infoRollingFile
        - ref: warnRollingFile
        - ref: errorRollingFile

曾是然
148 声望864 粉丝

Hello World~