Spring Boot 整合 log4j2 日志配置教程

文章目录
  • 前言
  • 一、常用日志框架
  • 二、配置参数介绍
    • [1. 日志级别](#1. 日志级别)
    • [2. 输出形式](#2. 输出形式)
    • [3. 日志格式](#3. 日志格式)
      • [3.1 PatternLayout 自定义日志布局](#3.1 PatternLayout 自定义日志布局)
  • [三、Log4j2 配置详解](#三、Log4j2 配置详解)
    • [1. 根节点 Configuration](#1. 根节点 Configuration)
    • [2. Appenders 节点](#2. Appenders 节点)
      • [2.1 Console 节点](#2.1 Console 节点)
      • [2.2 File 节点](#2.2 File 节点)
      • [2.3 RollingFile 节点](#2.3 RollingFile 节点)
        • [2.3.1 ThresholdFilter 节点](#2.3.1 ThresholdFilter 节点)
        • [2.3.2 Policies 节点](#2.3.2 Policies 节点)
        • [2.3.3 ThresholdFilter 节点](#2.3.3 ThresholdFilter 节点)
    • [3. Loggers 节点](#3. Loggers 节点)
      • [3.1 Root 节点](#3.1 Root 节点)
      • [3.2 Logger 节点](#3.2 Logger 节点)
  • [四、Log4j2 使用步骤](#四、Log4j2 使用步骤)
    • [1. pom.xml 添加依赖](#1. pom.xml 添加依赖)
    • [2. 配置 log4j2.xml](#2. 配置 log4j2.xml)
    • [3. 使用 lombok 工具简化创建 Logger 类](#3. 使用 lombok 工具简化创建 Logger 类)

前言

在项目推进中,如果说第一件事是搭建 Spring 框架的话,那么第二件事情就是在 Sring 基础上搭建日志框架,此篇文章是博主在学习过程中使用 Spring Boot 搭建项目时整合 Log4j2 日志的总结


一、常用日志框架

  • java.util.logging:是 JDK 在1.4版本中引入的 Java 原生日志框架
  • Log4j:Apache 的一个开源项目,可以控制日志信息输送的目的地是控制台、文件、GUI组件等
  • LogBack:是 Log4j 的一个改良版本
  • Log4j2:Log4j2 已经不仅仅是 Log4j 的一个升级版本了,它从头到尾都被重写了

二、配置参数介绍

1. 日志级别

共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF

机制:如果一条日志信息的级别大于等于配置文件的级别,就记录

  • All:最低等级的,用于打开所有日志记录
  • Trace:追踪,就是程序推进一下,可以写个 trace 输出
  • Debug:调试,指出细粒度信息事件,对调试应用程序是非常有帮助的
  • Info:消息在粗粒度级别上突出强调应用程序的运行过程
  • Warn:输出警告及 warn 以下级别的日志,有些信息不是错误信息,但也要给程序员一些提示
  • Error:输出错误信息日志
  • Fatal:输出每个严重的错误,将会导致应用程序的退出的日志
  • OFF:最高等级,用于关闭所有日志记录

2. 输出形式

  • CONSOLE(输出到控制台)
  • FILE(输出到文件)

3. 日志格式

  • SimpleLayout:以简单的形式显示
  • HTMLLayout:以 HTML 表格显示
  • PatternLayout:自定义形式显示
3.1 PatternLayout 自定义日志布局

Console 节点、File 节点、RollingFile 节点的子节点,指定输出格式,不设置默认为:%m%n

属性:

  • pattern:指定日志格式

自定义日志格式:

复制代码
%d{yyyy-MM-dd HH:mm:ss, SSS}: 日志生产时间,输出到毫秒的时间
%-5level: 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%p: 日志输出格式
%c: logger的名称(%logger)
%m : 日志内容, 即 logger.info("message")
%n: 换行符
%C: Java类名(%F)
%L: 日志输出所在行数
%M: 日志输出所在方法名
%l: 输出语句所在的行数, 包括类名、方法名、文件名、行数
%t: 表示线程名(%thread)
hostName: 本地机器名
hostAddress: 本地ip地址

三、Log4j2 配置详解

1. 根节点 Configuration

log4j2.xml 的根节点,有两个属性,两个子节点

属性:

  • status:用来指定 log4j 本身的打印日志的级别
  • monitorinterval:用来指定 log4j 自动重新配置的监测间隔时间,单位:s,最小是 5s

子节点:

  • Appenders
  • Loggers (表明可以定义多个 Appender 和 Logger)

2. Appenders 节点

Configuration 根节点的子节点,常见的有三种子节点:Console、File、RollingFile

2.1 Console 节点

Appenders 节点的子节点,用来定义输出到控制台的 Appender

属性:

  • name:用来指定 Appender 的名字
  • target:可选值 SYSTEM_OUT 或 SYSTEM_ERR。一般只设置默认:SYSTEM_OUT

子节点:

  • PatternLayout:输出格式,默认值:%m%n
2.2 File 节点

Appenders 节点的子节点,用来定义输出到指定位置的文件的 Appender,一般用来测试输出

属性:

  • name:用来指定 Appender 的名字
  • fileName:指定输出日志的目的文件带全路径的文件名

子节点:

  • PatternLayout:输出格式,默认值:%m%n
  • ThresholdFilter:指定输出级别
2.3 RollingFile 节点

Appenders 节点的子节点,用来定义超过指定大小,自动删除旧的创建新的 Appender

属性:

  • name:用来指定 Appender 的名称
  • fileName:指定输出日志的目的文件带全路径的文件名
  • filePattern:指定新建日志文件的名称格式

子节点:

  • ThresholdFilter:决定日志事件能否被输出
  • PatternLayout:输出格式,默认值:%m%n
  • Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志
  • DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时,开始删除最旧的,创建新的日志文件(通过 max 属性)
2.3.1 ThresholdFilter 节点

RollingFile 节点的子节点,决定日志事件能否被输出。过滤条件有三个值:ACCEPT (接受),DENY (拒绝) or NEUTRAL (中立)

属性:

  • level:指定过滤日志的级别
  • onMatch:默认值是 NEUTRAL
  • onMismatch:默认值是 DENY
2.3.2 Policies 节点

RollingFile 节点的子节点,指定滚动日志的策略

子节点:

  • TimeBasedTriggeringPolicy:基于时间的滚动策略,interval 属性用来指定多久滚动一次,默认是 1hour。modulate = true 用来调整时间
  • SizeBasedTriggeringPolicy:基于指定文件大小的滚动策略,size 属性用来定义每个日志文件的大小
2.3.3 ThresholdFilter 节点

3. Loggers 节点

Configuration 根节点的子节点

子节点:

  • Root:用来指定项目的根日志,如果没有单独指定 Logger,那么就会默认使用该 Root 日志输出
  • Logger:用来单独指定日志的形式,比如要为指定包下的 class 指定不同的日志级别等
3.1 Root 节点

Loggers 节点的子节点

属性:

  • level:指定日志输出级别

子节点:

  • appender-ref:用来指定该日志输出到哪个 Appender,通过 ref 指定
3.2 Logger 节点

属性:

  • level:指定日志输出级别
  • name:用来指定该 Logger 所适用的类或者类所在的包全路径,继承自 Root 节点

子节点:

  • appender-ref:用来指定该日志输出到哪个Appender,通过 ref 指定

四、Log4j2 使用步骤

1. pom.xml 添加依赖

Spring Boot 默认是用 logback 的日志框架的,所以需要排除 logback,不然会出现 jar 依赖冲突的报错

复制代码
<!-- web -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!--去掉SpringBoot默认配置-->
    <exclusions>
        <!--过滤系统默认的logback日志-->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- Log4j2 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

2. 配置 log4j2.xml

在 resources 下新建 log4j2.xml 文件并写入以下内容:

复制代码
<?xml version="1.0" encoding="UTF-8"?>

<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval: Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration monitorInterval="5">
    <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->

    <!-- 自己设置属性,后面通过${}来访问 -->
    <properties>
        <!--日志存放目录-->
        <property name="LOG_HOME">log4j2-logs</property>
        <!--日志名称-->
        <property name="LOG_NAME">patrick-blog-server</property>
        <!--日志格式-文件-->
        <property name="LOG_FORMAT">[%d{yyyy-MM-dd HH:mm:ss.SSS}] %p %t %c[%L] - %m %n</property>
        <!--日志格式-控制台-->
        <property name="LOG_FORMAT_CONSOLE">%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%-5level} [%t] %highlight{%c{1.}.%M(%L)}: %msg%n%throwable</property>
        <!--备份目录- 根据年月建立文件夹 -->
        <property name="BACKUP_HOME">${LOG_HOME}/$${date:yyyy-MM}</property>
        <!--备份频率-->
        <property name="BACK_HZ">%d{yyyy-MM-dd}</property>
    </properties>

    <appenders>
        <!--控制台日志-->
        <console name="console" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="${LOG_FORMAT_CONSOLE}" disableAnsi="false" noConsoleNoAnsi="false"/>
            <!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
        </console>

        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
        <File name="filelog" fileName="${LOG_HOME}/${LOG_NAME}/test.log" append="false">
            <PatternLayout pattern="${LOG_FORMAT}"/>
        </File>

        <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="infoLog" fileName="${LOG_HOME}/${LOG_NAME}/info.log" filePattern="${LOG_HOME}/${LOG_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_FORMAT}"/>
            <Policies>
                <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="10MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
            <DefaultRolloverStrategy max="15"/>
        </RollingFile>

        <!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="warnLog" fileName="${LOG_HOME}/${LOG_NAME}/warn.log" filePattern="${LOG_HOME}/${LOG_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_FORMAT}"/>
            <Policies>
                <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="10MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
            <DefaultRolloverStrategy max="15"/>
        </RollingFile>

        <!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="errorLog" fileName="${LOG_HOME}/${LOG_NAME}/error.log" filePattern="${LOG_HOME}/${LOG_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_FORMAT}"/>
            <Policies>
                <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="10MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
            <DefaultRolloverStrategy max="15"/>
        </RollingFile>

    </appenders>

    <!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
    <!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>

        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <logger name="org.mybatis" level="info" additivity="false">
            <AppenderRef ref="console"/>
        </logger>
        <!--监控系统信息-->
        <!--若是additivity设为false,则子Logger 只会在自己的appender里输出,而不会在父Logger 的appender里输出。-->
        <Logger name="org.springframework" level="info" additivity="false">
            <AppenderRef ref="console"/>
        </Logger>

        <root level="info">
            <!-- 输出到控制台 -->
            <appender-ref ref="console"/>
            <!-- 输出到文件 -->
            <appender-ref ref="filelog"/>
            <appender-ref ref="infoLog"/>
            <appender-ref ref="warnLog"/>
            <appender-ref ref="errorLog"/>
        </root>
    </loggers>

</configuration>

3. 使用 lombok 工具简化创建 Logger 类

使用 lombok 可以省略构建 logger 实例的过程,用 @Slf4j 注解简化开发

复制代码
@Slf4j
public class LogTest {
  
  public static void main(String... args) {
    log.error("Something is warning here");
  }
  
}

相关推荐
JH30738 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
qq_124987075311 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_11 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
2301_8187320612 小时前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea
汤姆yu15 小时前
基于springboot的尿毒症健康管理系统
java·spring boot·后端
暮色妖娆丶15 小时前
Spring 源码分析 单例 Bean 的创建过程
spring boot·后端·spring
biyezuopinvip16 小时前
基于Spring Boot的企业网盘的设计与实现(任务书)
java·spring boot·后端·vue·ssm·任务书·企业网盘的设计与实现
JavaGuide17 小时前
一款悄然崛起的国产规则引擎,让业务编排效率提升 10 倍!
java·spring boot
figo10tf17 小时前
Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
java·spring boot·后端
zhangyi_viva17 小时前
Spring Boot(七):Swagger 接口文档
java·spring boot·后端