SpringBoot 使用 log4j2

2023-11-17

一、新建工程

IDEA 新建SpringBoot工程
IDEA新建SpringBoot工程
选择一些基础依赖
基础依赖包
基础依赖
填写工程名称和项目路径
工程名称和路径

二、工程配置

修改文件编码格式
IDEA设置工程的编码格式
设置Java Compiler
设置Java Compiler
修改maven配置文件路径
修改maven配置文件路径

三、pom.xml的web依赖中排除掉logging依赖,并且引入log4j2依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <!-- 排除掉logging,不使用logback,改用log4j2 -->
        <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>

四、springboot配置

logging:
  config: classpath:log4j2.xml

五、log4j2配置文件

<configuration status="OFF" monitorInterval="30">
    <Properties>
        <Property name="pattern">%d{yyyy-MM-dd HH:mm:ss,SSS}|%p|%c|%L|%m%n</Property>
        <Property name="logPath">logs</Property>
    </Properties>
    <Appenders>
        <!--设置在控制台打印日志-->
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${pattern}"/>
        </Console>
        <!--设置级别为 DEBUG 日志输出到 debug.log 中-->
        <RollingRandomAccessFile name="debug"
                     			 immediateFlush="false"
                     			 fileName="${logPath}/debug.log"
                     			 filePattern="${logPath}/debug-%d{yyyy-MM-dd}.log">
            <Filters>
                <!--设置只输出级别为 debug 的日志-->
                <ThresholdFilter level="DEBUG"/>
                <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="${pattern}"/>
            <Policies>
                <!-- 按天生成日志文件-->
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
            </Policies>
            <!-- 最多保存日志文件的数目 -->
            <DefaultRolloverStrategy max="15"/>
        </RollingRandomAccessFile>
        <RollingRandomAccessFile name="info"
                                 immediateFlush="false"
                     			 fileName="${logPath}/info.log"
                     			 filePattern="${logPath}/info-%d{yyyy-MM-dd}.log">
            <Filters>
                <ThresholdFilter level="INFO"/>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>

            </Filters>
            <PatternLayout pattern="${pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
            </Policies>
            <DefaultRolloverStrategy max="60"/>
        </RollingRandomAccessFile>
        <RollingRandomAccessFile name="warn"
                                 immediateFlush="false"
                     			 fileName="${logPath}/warn.log"
                     			 filePattern="${logPath}/warn-%d{yyyy-MM-dd}.log">
            <Filters>
                <ThresholdFilter level="WARN"/>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="${pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
            </Policies>
            <DefaultRolloverStrategy max="60"/>
        </RollingRandomAccessFile>
        <RollingRandomAccessFile name="error"
                     			 immediateFlush="false"
                                 fileName="${logPath}/error.log"
                     			 filePattern="${logPath}/error-%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="${pattern}"/>
            <Filters>
                <ThresholdFilter level="ERROR"/>
            </Filters>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
            </Policies>
            <DefaultRolloverStrategy max="60"/>
        </RollingRandomAccessFile>
        <!-- 设置 task_suc 日志 -->
        <RollingRandomAccessFile name="task_suc"
                                 immediateFlush="false"
                     			 fileName="${logPath}/task_suc.log"
                     			 filePattern="${logPath}/task_suc-%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="${pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
            </Policies>
            <DefaultRolloverStrategy max="90"/>
        </RollingRandomAccessFile>
        <!-- 设置 task_fail 日志 -->
        <RollingRandomAccessFile name="task_fail"
                                 immediateFlush="false"
                     			 fileName="${logPath}/task_fail.log"
                     			 filePattern="${logPath}/task_fail-%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="${pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
            </Policies>
            <DefaultRolloverStrategy max="90"/>
        </RollingRandomAccessFile>
    </Appenders>
    <Loggers>
        <Logger name="com.example.log4j2demo" level="DEBUG" additivity="true">
            <AppenderRef ref="debug"/>
            <AppenderRef ref="info"/>
            <AppenderRef ref="warn"/>
            <AppenderRef ref="error"/>
        </Logger>
        <!-- org.springframework 只输出 ERROR 级别以上的日志 -->
        <Logger name="org.springframework" level="ERROR"/>
        <!-- org.apache 只输出 ERROR 级别以上的日志 -->
        <Logger name="org.apache" level="ERROR"/>
        <!-- task_suc 日志 -->
        <Logger name="task_suc" additivity="true">
            <AppenderRef ref="task_suc"/>
        </Logger>
        <!-- task_fail 日志 -->
        <Logger name="task_fail" additivity="true">
            <AppenderRef ref="task_fail"/>
        </Logger>
        <Root level="DEBUG">
            <AppenderRef ref="console"/>
        </Root>
    </Loggers>
</configuration>

注:

1、configuration 标签

<!--
status 级别有8个:ALL,TRACE, DEBUG, INFO, WARN, ERROR ,FATAL,OFF。是帮助开发者找错用的,它可以检测log4j 2的配置文件是否有错,也可以检测到死循环的logger
monitorInterval log4j2 自动检测配置文件的时间间隔(单位:秒)
-->
<configuration status="OFF" monitorInterval="30">

2、Console标签

<!--
设置在控制台打印日志
将输出写到 System.err 或 System.out 。如果想将输出写到System.out,设置Console标签下的target为 SYSTEM_OUT ;如果想将输出写到System.err,设置Console标签下的target为 SYSTEM_ERR
-->
<Console name="console" target="SYSTEM_OUT">
    <PatternLayout pattern="${pattern}"/>
</Console>

3、日志输出格式

<!--
日志输出格式,每个转换说明符以百分号(%)开头,'%'后面的转换字符有如下:
p (level) 日志级别
c(logger) Logger的Name
C (class) Logger调用者的全限定类名
d (date) 日期
highlight 高亮颜色
l (location) 调用位置
L (line) 行号
m (msg/message) 输出的内容
M (methode) 调用方法 ***
maker marker的全限定名
n 输出平台相关的换行符,如'\n' '\r\n'
pid (processId) 进程ID
level (p)日志级别
r JVM启动后经过的微秒
t (tn/thread/threadName) 线程名称
T (tid/threadId) 线程ID
tp (threadPriority) 线程优先级
x (NDC) 线程Context堆栈
-->
<Property name="pattern">%d{yyyy-MM-dd HH:mm:ss,SSS}|%p|%c|%L|%m%n</Property>

4、RollingRandomAccessFile 标签

<!--
设置级别为 DEBUG 日志输出到 debug.log 中
日志写入策略 immediateFlush log4j2接收到日志事件时,是否立即将日志刷到磁盘。默认为true 。
异步日志将会自动批量刷新到磁盘,所以这里设置为false
-->
<RollingRandomAccessFile name="debug"
                         immediateFlush="false"
                         fileName="${logPath}/debug.log"
                         filePattern="${logPath}/debug-%d{yyyy-MM-dd}.log">
    <Filters>
        <!--设置只输出级别为 debug 的日志-->
        <ThresholdFilter level="DEBUG"/>
        <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
    </Filters>
    <PatternLayout pattern="${pattern}"/>
    <Policies>
        <!--
        根据时间生成日志文件
        单位:以文件命名中的时间精度来确定单位。比如 yyyy-MM-dd 单位为天,yyyy-MM-dd-HH 单位为小时
        interval:时间间隔
        -->
        <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
    </Policies>
    <!-- 最多保存日志文件的数目 -->
    <DefaultRolloverStrategy max="15"/>
</RollingRandomAccessFile>

RollingRandomAccessFile 为异步日志,RollingFile 为同步日志。

5、Logger 标签

<!-- 整个工程默认日志实例,name=工程名,例如用@Slf4j这个注解或者LoggerFactory.getLogger(XXX.class)的日志实例 -->
<Logger name="com.example.log4j2demo" level="DEBUG" additivity="true">
    <AppenderRef ref="debug"/>
    <AppenderRef ref="info"/>
    <AppenderRef ref="warn"/>
    <AppenderRef ref="error"/>
</Logger>

六、使用示例

@Slf4j
@SpringBootTest
class Log4j2DemoApplicationTests {
    private static final Logger sucLog = LoggerFactory.getLogger("task_suc");
    private static final Logger failLog = LoggerFactory.getLogger("task_fail");
    private static final Logger sysLog = LoggerFactory.getLogger(Log4j2DemoApplicationTests.class);

    @Test
    void log4j2() {
        sucLog.debug("task_suc debug");
        sucLog.info("task_suc info");
        sucLog.warn("task_suc warn");
        sucLog.error("task_suc error");

        failLog.debug("task_fail debug");
        failLog.info("task_fail info");
        failLog.warn("task_fail warn");
        failLog.error("task_fail error");

        log.debug("normal debug");
        log.info("normal info");
        log.warn("normal warn");
        log.error("normal error");

        sysLog.debug("sys debug");
        sysLog.info("sys info");
        sysLog.warn("sys warn");
        sysLog.error("sys error");
    }

}

控制台输出结果:
控制台输出结果

日志文件:
日志文件

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

SpringBoot 使用 log4j2 的相关文章

随机推荐

  • PCB添加图片或logo的方法

    系列文章目录 1 元件基础 2 电路设计 3 PCB设计 4 元件焊接 6 程序设计 文章目录 前言 一 图片预处理 转为 BMP格式 二 给Altium designer安装PCB LOGO Creator脚本插件 三 给PCB添加图片或
  • 【读书笔记->数据分析】BDA教材《数据分析》书籍介绍

    BDA教材 数据分析 书籍介绍 BDA BDA数据分析职业技能等级 旨在培养基于数据分析理论 计算机技术以及行业案例应用 三维一体 的大数据分析人才 培养数据管理 数据分析 数据挖掘 数据洞察方面的复合型和应用型专业人才 BDA数据分析师证
  • stm32霍尔编码器电机测速原理

    本次选用的编码器电机为13线的霍尔编码器电机 电机减速比为30 1 转动一圈输出13 30 390个脉冲 轮胎直径为75mm 轮胎周长为pi d 3 75 225mm 定时器采用四倍频计数 则一圈输出390 4 1560个脉冲 具体编码器知
  • Python基础 第3课

    Python基础 3 函数 独立定义 独立调用 def foo pass foo 方法 依赖定义 依赖调用 方法存在于类的内部 1 变量作用域 全局 本地 闭包 局部 全局 global一般在函数体外定义的变量成为全局变量 在函数内部定义的
  • QT笔记- QString字符串左右截取——left() 和 right()

    left int n 从左向右截取n个字符串 right int n 从右向左截取n个字符串 注 第二个参数是一个索引 表示函数的目标字符串是该索引之前的字符串
  • VUE(未写完)

    文章目录 一 如何学习VUE 二 VUE的概念 三 MVVM MV 四 如何使用VUE Vue的指令的操作 v 都是代表指令 回忆 filter 五 json server 六 生命周期 8个 七 watch 监听 八 computed 计
  • Opening a specific View directly from the SiteMap in Dynamics

    Opening a specific View directly from the SiteMap in Dynamics CRM Consultancy Blog Dynamics 365 Unified User Interface D
  • 2022蓝桥杯A组Python

    更新 江苏赛区省一 昨天特别高兴 今天有点高兴 后续会继续更新动态规划的部分 国赛最近也在刷题但有点懒得写博客了 事情有点多 2022 04 29 蓝桥杯开始啦 还有七分钟就到九点了 心情有点激动 复习不进去 发个博客吧 2022 04 0
  • 应用使用Druid连接池经常性断链问题分析

    前段时间有应用使用Druid连接池经常的提示断链报错 整个问题排查分析过程很有意思 这里将Druid连接池 数据库层以及负载均衡层的配置分析下 记录整个问题的分析过程 同时梳理下Druid连接池的配置和连接保活及回收机制 1 问题背景 应用
  • 离散数据:析取范式与合取范式

    一 前言 析取范式和合取范式是命题逻辑等值演算中的重要内容 其目的是为了标准化命题公式 下面我将给出析取范式和合取范式的计算步骤 又由于析取范式和合取范式的形式不唯一 为了便于比较命题公式之间的关系 因此衍生出了主析取范式和主合取范式 所以
  • linux漏洞处理(更新中)

    1 Diffie Hellman Key Agreement Protocol 资源管理错误漏洞 CVE 2002 20001 vim etc ssh sshd config 在文件中加入下方配置 KexAlgorithms diffie
  • 【C++入门到精通】C++入门 —— 内存管理(new函数的讲解)

    目录 一 C C 内存分布 1 栈 Stack 2 堆 Heap 3 全局区 静态区 Global Area Static Area 4 常量区 Constant Area 5 代码区 Code Area 二 C语言中动态内存管理方式 1
  • 在Ubuntu上基于wayland/weston源码构建weston桌面

    Ubuntu构建weston桌面 简介 下载工具 库 安装ninja 设置环境变量 构建wayland 构建wayland protocols 构建weston 运行weston weston的一些测试程序 简介 wayland官网 htt
  • mybatis choose when 多条件_Mybatis—动态SQL详解

    前言 今天我们来聊聊Mybatis的动态SQL的使用 动态SQL可以说是mybatis的核心 可以对SQL语句进行灵活操作 通过表达式进行判断 对SQL进行灵活拼接 组装 在实际项目开发中 我们还可以将在业务层处理的逻辑转移到SQL中进行处
  • ubuntu下开启端口

    查看端口启动情况 sudo ufw status 开启端口号命令 sudo ufw allow lt 端口号 gt v6的意思就是 ipv6 开启防火墙 sudo ufw enable
  • 小米9开源linux内核,小米开源 Redmi Note 8 Pro 和 Note 9 Pro 系列的内核源码

    小米开源了基于 Android Q 的 Redmi Note 8 Pro 代号 begonia 以及 Redmi Note 9 Pro Note 9 Pro Max 代号 curtana 的内核源码 按照 XDA 的说法 GPLv2 要求所
  • 初学者的卡尔曼滤波——扩展卡尔曼滤波

    简介 转自 http www cnblogs com ymxiansen p 5368547 html 已经历经了半个世纪的卡尔曼滤波至今仍然是研究的热点 相关的文章不断被发表 其中许多文章是关于卡尔曼滤波器的新应用 但也不乏改善和扩展滤波
  • vue中监听元素尺寸变化

    data中 widthPlay 0 元素宽 heightPlay 0 元素高 observer null mounted中监听 let ResizeObserver window ResizeObserver window WebKitRe
  • 极光笔记

    PART 01 前 言 随着网络技术的发展 从粗犷型到精细化运营型 再到现在的数字化运营 数据变得越来越细分和重要 不仅可以进行策略调整 还可以实现自动化的精细化运营 而数据价值的起点就是埋点 只有合理地埋点 规范地上报 数据才会产生价值
  • SpringBoot 使用 log4j2

    一 新建工程 选择一些基础依赖 填写工程名称和项目路径 二 工程配置 修改文件编码格式 设置Java Compiler 修改maven配置文件路径 三 pom xml的web依赖中排除掉logging依赖 并且引入log4j2依赖