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 的相关文章

  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • 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依赖