Spring Boot日志框架Log4j 2详解(干货)

2023-11-19

程序开发过程中,Log日志是发现问题和分析问题的利器,可以通过打印的Log可以快速的定位bug出现的原因,好的Log信息还会提供问题的解决方法。

Spring Boot 默认使用的是logback日志框架,在性能方面Log4j2更优。Spring Boot 不再支持log4j。log4j 2 不支持 properties 配置文件,支持 xml、json、yml格式的文件。接下来就来聊聊Spring Boot如何配置Log4j2以及相关的配置的说明,本文只讲理论,下一篇进入实战,古人就曾说过书读百遍其义自见嘛。

添加Log4j2的依赖

假装你正在创建的项目是Maven项目,在pom.xml文件中添加如下依赖:


<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.1.3.RELEASE</version>
            <exclusions>
             <!-- 去掉SpingBoot默认的logback配置 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.1.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <dependency>
            <groupId>com.wpf</groupId>
            <artifactId>wpf-utils</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.wpf</groupId>
            <artifactId>commom-util</artifactId>
            <version>1.0.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
            <version>2.2.0.RELEASE</version>
            <!--<version>1.5.7.RELEASE</version>-->
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-yaml</artifactId>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.2</version>
        </dependency>
        
        <!--添加log4j2-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.3.7</version>
        </dependency>

    </dependencies>

我这里用的Spring Boot的版本是2.1.3.RELEASE,当前的最新版本是2.2.1.RELEASE。

Spring Boot 默认使用的是logback日志框架的,所以需要exclusions进行依赖排除,否则在运行的时候提示jar冲突。

 		<exclusions>
             <!-- 去掉SpingBoot默认的logback配置 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>

添加好依赖之后,下面就开始创建log4j2的配置文件。

创建log4j2.xml文件

在resources目录下创建一个log4j2.xml文件:

<?xml version="1.0" encoding="UTF-8"?>

<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL-->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="WARN" monitorInterval="30">
    <!--先定义所有的appender-->
    <appenders>
        <!--这个输出控制台的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
        </console>
        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
        <File name="log" fileName="log/dev.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>
        <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFileInfo" fileName="logs/info.log"
                     filePattern="logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
        <RollingFile name="RollingFileWarn" fileName="logs/warn.log"
                     filePattern="logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
        <RollingFile name="RollingFileError" fileName="logs/error.log"
                     filePattern="logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
    </appenders>
    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <logger name="org.springframework" level="INFO"></logger>
        <logger name="org.mybatis" level="INFO"></logger>
        <root level="all">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>

log4j2配置文件结构

log4j2文件配置文件分为2块:appenders和loggers;

Appenders

Appenders官方给出的描述是“Appenders are responsible for delivering LogEvents to their destination.”

大致的意思是:Appender负责将LogEvents传递到其目的地。
它常用的三种子节点:Console,RollingFile、File:

Console节点用来定义输出到控制台的Appenders.
RollingFile节点用来定义超过指定大小白动删除旧的创建新的Appender。
File节点用来定义输出到指定位置的文件的Appender。

Log4j2提供了一些常用的Appenders:

  • FileAppender :普通地输出到本地文件;
  • FlumeAppender:将几个不同源的日志汇集、集中到一处;
  • JMSQueueAppender VS. JMSTopicAppender:JMS相关的日志输出;
  • RewriteAppender :对日志事件进行掩码或注入信息;
  • RollingFileAppender:对日志文件进行封存(详细);
  • RoutingAppender:在输出地之间进行筛选路由;
  • SMTPAppender:将LogEvent发送到指定邮件列表;
  • SocketAppender:将LogEvent以普通格式发送到远程主机;
  • SyslogAppender:将LogEvent以RFC 5424格式发送到远程主机;
  • AsynchAppender :将一个LogEvent异步地写入多个不同输出地;
  • ConsoleAppender:将LogEvent输出到命令行;
  • FailoverAppender:维护一个队列,系统将尝试向队列中的Appender依次输出LogEvent,直到有一个成功为止。
Appenders->Console节点

先看下节点代码结构:

 <console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
        </console>

用来定义输出到控制台的Appender。
name:指定Appender的名字;
target:SYSTEM_OUT或SYSTEM_ERR,通常设为SYSTEM_OUT;
PatternLayout:输出格式,不设置默认为:%m%n;

Appenders->RollingFile节点

先看下节点代码结构:

 <RollingFile name="RollingFileInfo" fileName="logs/info.log"
                     filePattern="logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>

name:指定Appender的名字。
FileName:指定输出日志的目的文件带全路径的文件名。
PatternLayout:输出格式,不设置默认为:%m%n。
ThresholdFilter : 决定日志事件能否被输出。过滤条件有三个值:ACCEPT(接受),DENY(拒绝),NEUTRAL(中立)。

常用的 Filter 类有一下三个:
LevelRangeFilter
TimeFilter
ThresholdFilter

FilePattern:指定新建日志文件的名称格式。
Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志。
TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动依次,默认1hour。
SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小。

Appenders->RollingFile->PatternLayout

常用的日志格式转换类;

 <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>

常用格式说明

%d{HH:mm:ss.SSS} 表示输出到毫秒的时间
%t 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%class{36} 输入日志的类名,常用设置{36}表示层数
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出
%msg 日志文本
%n 换行

其他常用的占位符有:
%F 输出所在的类文件名,如Client.java
%L 输出行号
%M 输出所在方法名
%l 输出语句所在的行数, 包括类名、方法名、文件名、行数
Appenders->File节点

看节点代码:

 <File name="log" fileName="log/dev.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>

用来定义输出到指定位置的文件的Appender。
name:指定Appender的名字;
FileName:指定输出日志的目的文件带全路径的文件名;
PatternLayout:输出格式,不设置默认为:%m%n;

Loggers

 <loggers>
        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <logger name="org.springframework" level="INFO"></logger>
        <logger name="org.mybatis" level="INFO"></logger>
        <root level="all">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>

简单说 Logger 就是一个路由器,指定类、包中的日志信息流向哪个管道,以及控制他们的流量(日志级别)

Logger 部分为两个 节点:root和logger

root节点

root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性,level用来设置打印级别,TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL,默认是DEBUG;可以包含零个或多个元素,标识这个appender将会添加到这个logger。

 <root level="all">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
        </root>
logger节点
 <logger name="org.springframework" level="INFO"></logger>
 <logger name="org.mybatis" level="INFO"></logger>

logger用来设置某一个包或者具体的某一个类的日志打印级别、以及指定appender。logger仅有一个name属性,一个可选的level和一个可选的addtivity属性。

name:用来指定受此logger约束的某一个包或者具体的某一个类。
level:用来设置打印级别,TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前logger将会继承上级的级别。

注意:Logger 中也可以加过滤器的!

参考:
https://logging.apache.org/log4j/2.x/manual/appenders.html
https://michael728.github.io/2019/08/10/java-spring-boot-log4j2/
https://juejin.im/entry/5b35f1e86fb9a00e315c330e

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot日志框架Log4j 2详解(干货) 的相关文章

随机推荐

  • Springboot +mybatis-plus 实现公共字段自动填充

    本文讲述了在SpringBoot 中使用Mybatis Plus如何实现一个自动填充功能 目录 一 应用场景 二 代码实现步骤 1 建数据库表 t user 2 创建spring boot项目集成mybatis plus实现字段自动填充 2
  • 少儿机器人编程主要使用的语言有啥

    少儿机器人编程主要使用的语言 说起孩子的学习 想必家长们都是非常的有发言权的 很多的家长在培养孩子的学习方面也可以说相当的耐心的 他们会给孩子选择一些能够有利于孩子成长的课程 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 有的家长对
  • PHP开源大全

    WordPress PHP开源 博客Blog WordPress是最热门的开源个人信息发布系统 Blog 之一 基于PHP MySQL构建 WordPress提供的功能包括 1 文章发布 分类 归档 2 提供文章 评论 分类等多种形式的RS
  • MySQL数据库数据导出出现1290(secure_file_priv)错误解决方法

    目录 解决方案 测试效果 解决方案 secure file priv是用来限制mysql数据库导出的位置 目录 算是一直安全保护系统 我们可以去通过show variables like secure 这个指令去查看secure file
  • 2021-05-08记录一次最新版小红书逆向细节

    预备工具 ida7 5 piexl 手机 jadx jeb 某书是有TracerPid反调试 先过反调试 这有两个方法 1 Frida hook fopen 过滤 2 修改安卓源码去掉TracerPid 1 Frida hook脚本 fun
  • Python入门到实战(十一)无监督学习、KMeans、KNN、实现图像分割、监督学习VS无监督学习

    Python入门到实战 十一 无监督学习 KMeans KNN 实现图像分割 监督学习VS无监督学习 无监督学习unsupervised learning 特点 应用 K均值聚类 核心流程 核心公式 KMeans VS KNN 实战 KMe
  • 深度遍历 和 广度遍历

    深度dfs 用到了递归 先把根节点 输出根节点 然后遍历根节点的孩子 const fun1 root gt console log root val root children forEach fun1 fun1 tree 广度遍历 每次遍
  • java 集成MinIo

    1 引入maven包 注意jar包冲突
  • 在springboot打包成jar后,无法读取自定义文件的解决办法

    前两天在做springcloud框架下的项目的时候 用到有一个框架之外的文件需要进行读取 当时在eclipse中编码时通过this getClass getResource来获取文件的路径 没有任何的问题 但是在打成jar以后 这是是打成j
  • c++3之static、const、friend关键字

    1 1static 修饰局部变量 延长生命周期 由栈区 gt 静态区 修饰全局变量或函数 限制作用域 只能用于本文件中使用 static 成员变量 1 static成员变量不占class的空间 修饰成员变量 需要在外部单独定义 要加来源 A
  • Think-on-Graph: Deep and Responsible Reasoning of Large Language Model with Knowledge Graph

    本文是LLM系列文章 针对 Think on Graph Deep and Responsible Reasoning of Large Language Model with Knowledge Graph 的翻译 对图的思考 基于知识图
  • TensorFlow时间序列tfts-seq2seq

    关注我的公众号YueTan进行交流探讨 欢迎关注时间序列仓库 https github com LongxingTan Time series prediction 时间序列1 概述 时间序列2 transformers 时间序列3 seq
  • Windows11 安卓子系统安装(附apk安装步骤)

    Windows11 安卓子系统安装 附apk安装步骤 系列 Android 前言 Win11安卓子系统 Windows Subsystem for Android 是一个组件 以帮助通过亚马逊商店在其上运行Android 应用程序 在最新的
  • Golang适合高并发场景的原因分析

    典型的两个现实案例 我们先看两个用Go做消息推送的案例实际处理能力 360消息推送的数据 16台机器 标配 24个硬件线程 64GB内存 Linux Kernel 2 6 32 x86 64 单机80万并发连接 load 0 2 0 4 C
  • VBA-选择文件对话框

    打开选择路径对话框 strTitle 对话框标题名 strTypesDec 选择文件类型名 多文件名时用 连接 Images All files strExten 选择文件类型 一个文件名有多个读取类型时用 连接 多个文件名用 连接 gif
  • c++ extern的用处(转载)

    转自chao yu cnblog com 1 基本解释 extern可以置于变量或者函数前 以标示变量或者函数的定义在别的文件中 提示编译器遇到此变量和函数时在其他模块中寻找其定义 此外extern也可用来进行链接指定 也就是说extern
  • ext4 mballoc之buddy算法

    buddy bitmap 根据 Ext4文件系统介绍 理论篇 nginux的博客 CSDN博客 我们知道磁盘上有1block 大小 默认4K data block bitmap 每bit位代表一个block的使用情况 1代表占用 0代表空闲
  • 机器学习主题模型之LDA参数求解——变分推断+EM近似

    由上一篇可知LDA主要有两个任务 对现有文集确定LDA模型参数 的值 或对一篇新文档 根据模型确定隐变量的分布p z w 由于无法直接求出这个后验分布 因此可以考虑使用Laplace近似 变分近似 MCMC Gibbs采样法等算法求解 1
  • 如何解决Visual Studio 2017 运行后控制台窗口一闪就消失了

    安装使用Visual Studio 2017 后 用Ctrl F5运行程序 结果控制台窗口一闪就没了 也没有出现 press any key to continue 或者 请按任意键继续 出现这种原因 主要是建立工程时选用的是 空工程 Em
  • Spring Boot日志框架Log4j 2详解(干货)

    程序开发过程中 Log日志是发现问题和分析问题的利器 可以通过打印的Log可以快速的定位bug出现的原因 好的Log信息还会提供问题的解决方法 Spring Boot 默认使用的是logback日志框架 在性能方面Log4j2更优 Spri