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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343