log4j2的日志框架(详细,springboot和异步日志的实现)
目录
log4j2的介绍
Log4j2的性能
SpringBoot中的使用Log4j2
log4j2的进阶--异步日志
AsyncAppender方式
AsyncLogger方式
log4j2的介绍
Apache Log4j 2是对Log4j的升级版,参考了logback的一些优秀的设计,并且修复了一些问题,因此带 来了一些重大的提升,主要有:
- 异常处理,在 logback中,Appender中的异常不会被应用感知到,但是在log4j2中,提供了一些异 常处理机制。
- 性能提升, log4j2相较于log4j 和logback都具有很明显的性能提升,后面会有官方测试的数据。
- 自动重载配置,参考了 logback的设计,当然会提供自动刷新参数配置,最实用的就是我们在生产 上可以动态的修改日志的级别而不需要重启应用。
- 无垃圾机制, log4j2在大部分情况下,都可以使用其设计的一套无垃圾机制,避免频繁的日志收集 导致的jvm gc。
官网地址: https://logging.apache.org/log4j/2.x/
Log4j2的性能
Log4j2最牛的地方在于异步输出日志时的性能表现,Log4j2在多线程的环境下吞吐量与Log4j和 Logback的比较如下图。下图比较中Log4j2有三种模式:1)全局使用异步模式;2)部分Logger采用异步模式;3)异步Appender。可以看出在前两种模式下,Log4j2的性能较之Log4j和Logback有很大的 优势。

无垃圾记录
垃圾收集暂停是延迟峰值的常见原因,并且对于许多系统而言,花费大量精力来控制这些暂停。
许多日志库(包括以前版本的Log4j)在稳态日志记录期间分配临时对象,如日志事件对象,字符串, 字符数组,字节数组等。这会对垃圾收集器造成压力并增加GC暂停发生的频率。
从版本2.6开始,默认情况下Log4j以“无垃圾”模式运行,其中重用对象和缓冲区,并且尽可能不分配临 时对象。还有一个“低垃圾”模式,它不是完全无垃圾,但不使用ThreadLocal字段。
Log4j 2.6中的无垃圾日志记录部分通过重用ThreadLocal字段中的对象来实现,部分通过在将文本转换 为字节时重用缓冲区来实现。
从图中可以看出log4j2的性能是完全吊打其他日志框架的,而且log4j2的异步日志功能非常的强大,可以大大的减少日志系统对业务系统的负担。基于这些功能,所以现在主流的日志开发架构就是SLF4J+Log4j2这个组合,所以这个log4j2这个日志框架是必须要学会的
SpringBoot中的使用Log4j2
springboot框架在企业中的使用越来越普遍,springboot日志也是开发中常用的日志系统。springboot 默认就是使用SLF4J作为日志门面,logback作为日志实现来记录日志。所以如果我们要在springboot项目中使用Log4j2,需要内置的日志框架给去除。
分成三步,第一移除默认的日志框架,第二加入log4j2的依赖(启动器),第三编写配置文件
- 移除默认的日志框架
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!--排除默认spring-boot-starter-logging启动器--><exclusions><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>
编写log4j2.xml配置文件‘
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><!-- 定义全局变量,日志文件路径和格式 --><Properties><Property name="log.path">./dev</Property><Property name="log.name">forlan-log4j2</Property><Property name="file.pattern">%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{50} - %msg%n</Property></Properties><!-- 控制台输出配置 --><Appenders><Console name="STDOUT" target="SYSTEM_OUT"><PatternLayout pattern="${file.pattern}"/><ThresholdFilter level="DEBUG"/></Console><!-- 文件输出配置 --><RollingFile name="INFO_FILE" fileName="${log.path}/${log.name}.info.log"filePattern="${log.path}/%d{yyyy-MM-dd}/${log.name}.info.%d{yyyy-MM-dd}-%i.log"><PatternLayout pattern="${file.pattern}"/><LevelMatchFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/><!-- 每个文件最大10MB --><SizeBasedTriggeringPolicy size="10MB"/><!-- 最多保留30天的历史记录 --><DefaultRolloverStrategy max="30"/></RollingFile><!-- 文件输出配置 --><RollingFile name="ERROR_FILE" fileName="${log.path}/${log.name}.error.log"filePattern="${log.path}/%d{yyyy-MM-dd}/${log.name}.error.%d{yyyy-MM-dd}-%i.log"><PatternLayout pattern="${file.pattern}"/><LevelMatchFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/><!-- 每个文件最大10MB --><SizeBasedTriggeringPolicy size="10MB"/><!-- 最多保留30天的历史记录 --><DefaultRolloverStrategy max="30"/></RollingFile></Appenders><!-- 设置root logger --><Loggers><Root level="INFO"><AppenderRef ref="STDOUT"/><AppenderRef ref="INFO_FILE"/><AppenderRef ref="ERROR_FILE"/></Root></Loggers>
</Configuration>
- 运行测试
@SpringBootTest
public class Slf4jTest {// 声明日志对象public final static Logger LOGGER = LoggerFactory.getLogger(Slf4jTest.class);@Testpublic void testQuick() throws Exception {//打印日志信息LOGGER.error("error");LOGGER.warn("warn");LOGGER.info("info");LOGGER.debug("debug");LOGGER.trace("trace");// 使用占位符输出日志信息String name = "jack";Integer age = 18;LOGGER.info("用户:{},{}", name, age);// 将系统异常信息写入日志try {int i = 1 / 0;} catch (Exception e) {// e.printStackTrace();LOGGER.info("出现异常:", e);}}
}

出现入上图的结果就代表log4j2就配置成功了,主要注意那个dev的日志文件是否生成,这个日志文件是在前面的配置文件中配置的。
到这里log4j2的基本使用其实已经可以实现了,对于一些小的项目,这样子配置就可以了,但对于那些大型项目,log4j2还可以更加强大,那就是使用它的异步日志功能
log4j2的进阶--异步日志
logl4j2最大的特点就是异步日志,其性能的提升主要也是从异步日志中受益,我们来看看如何使用 log4j2的异步日志。

Log4j2 提供了两种实现日志的方式,一个是通过AsyncAppender,一个是通过AsyncLogger,分别对应 前面我们说的Appender组件和Logger组件。
log4j2的全局异步AsyncLogger性能最好,第二个是混合异步AsyncLogger,性能最差的是AsyncAppender(和同步日志相比没有什么性能提升。和logback性能一样)
如果使用异步日志,全局异步AsyncLogger、混合异步AsyncLogger、AsyncAppender,不要同时使用。否则会使用性能较低的一种异步方式
注意:配置异步日志需要添加依赖
<!--异步日志依赖-->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.4</version>
</dependency>
AsyncAppender方式
AsyncAppender:这种使用方式较为简单,只需要在我们上述的Appender中加入以下标签即可:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="5"><properties><property name="LOG_HOME">C:/Users/dell/Desktop/java11Test/logs</property></properties><Appenders><File name="File" fileName="${LOG_HOME}/myFile.log"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %l --- %msg%n" /></File><!-- AsyncAppender引用appender --><Async name="Async"><AppenderRef ref="File"/></Async></Appenders><Loggers><Root level="INFO"><!-- 直接引用AsyncAppender --><AppenderRef ref="Async" /></Root></Loggers></Configuration>
AsyncLogger方式
AsyncLogger才是log4j2 的重头戏,也是官方推荐的异步方式。它可以使得调用Logger.log返回的 更快。你可以有两种选择:全局异步和混合异步。
全局异步 就是,所有的日志都异步的记录,在配置文件上不用做任何改动,只需要添加一个 log4j2.component.properties 配置;
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
混合异步 就是,你可以在应用中同时使用同步日志和异步日志,这使得日志的配置方式更加 灵活。
<!--logger定义--><Loggers><!--自定义异步logger对象includeLocation = "false" 关闭日志记录行好信息additivity = "false" 不再继承rootlogger对象--><AsyncLogger name = "com.itcats" level = "trace" includeLocation = "false" additivity = "false"><AppenderRef ref="Console"/></AsyncLogger><Root level = "trace"><AppenderRef ref ="Console"/></Root></Loggers>
将以上配置配置到我们之前的log4j2.xml配置文件中,将之前的logger定义替换。此时我们com.itcats日志是异步的,root日志是同步的。
使用异步日志需要注意的问题:
1. 如果使用异步日志,AsyncAppender、AsyncLogger和全局日志,不要同时出现。性能会和 AsyncAppender一致,降至最低。
2. 设置includeLocation=false ,打印位置信息会急剧降低异步日志的性能,比同步日志还要慢
到这里我们的java日志框架基本就介绍完了
相关文章:
log4j2的日志框架(详细,springboot和异步日志的实现)
目录 log4j2的介绍 Log4j2的性能 SpringBoot中的使用Log4j2 log4j2的进阶--异步日志 AsyncAppender方式 AsyncLogger方式 log4j2的介绍 Apache Log4j 2是对Log4j的升级版,参考了logback的一些优秀的设计,并且修复了一些问题,因此带 来…...
taocms 3.0.1 本地文件泄露漏洞(CVE-2021-44983)
前言 CVE-2021-44983 是一个影响 taoCMS 3.0.1 的远程代码执行(RCE)漏洞。该漏洞允许攻击者通过上传恶意文件并在服务器上执行任意代码来利用这一安全缺陷。 漏洞描述 taoCMS 是一个内容管理系统(CMS),用于创建和管…...
SpringBoot实战:处理全局异常
1. 导入springmvc依赖 2.定义全局异常处理类 //定义全局异常处理器,可捕获控制层抛出的异常 ControllerAdvice public class GlobalExceptionHandler {//当控制层抛出Exception异常时会被该方法捕获,并执行该方法ExceptionHandler(Exception.class)Res…...
pdf只要前几页,pdf中只要前几页怎么处理
在处理pdf文件时,我们有时只需要其中的一页或几页,而不是整个文档。那么,如何快速且高效地从pdf中提取单独的一页呢?本文将为你揭示几种简单易行的方法,让你轻松实现这一目标。 使用 “轻云处理pdf官网” 打开 “轻云…...
实变函数精解【4】
文章目录 说明点集与测度开集的极限点集定义与解释开集的导集特性示例结论 导集一、定义二、特点三、性质四、应用五、总结 边界点与聚点的区别一、定义二、性质与区别三、结论 有界点集与测度有界点集的测度不一定有限分析原因结论注意事项 测度有限的点集,不一定有…...
【BUG】Python3|COPY 指令合并 ts 文件为 mp4 文件时长不对(含三种可执行源代码和解决方法)
文章目录 前言源代码FFmpeg的安装1 下载2 安装 前言 参考: python 合并 ts 视频(三种方法)使用 FFmpeg 合并多个 ts 视频文件转为 mp4 格式 Windows 平台下,用 Python 合并 ts 文件为 mp4 文件常见的有三种方法: 调用…...
AI克隆声音,基于函数计算部署GPT-Sovits语音生成模型
阿里云的基于函数计算部署GPT-Sovits语音生成模型 可以直接文字转语音,也可以上传一段自己的语音,根据你上传的语音进行语音播报。 一、打开阿里云的函数计算 https://developer.aliyun.com/adc/scenario/808348a321844a62b922187d89cd5077 还是 函数…...
DP讨论——建造者模式
学而时习之,温故而知新。 敌人出招(使用场景) 组合关系中,如果要A对象创建B对象,或者要A对象创建一堆对象,这种是普遍的需求。 你出招 这种适合创建者模式,我感觉也是比较常见的。 构造函数…...
【JavaScript】解决 JavaScript 语言报错:Uncaught SyntaxError: Unexpected token
文章目录 一、背景介绍常见场景 二、报错信息解析三、常见原因分析1. 缺少必要的语法元素2. 使用了不正确的字符或符号3. JSON 格式错误4. 字符串未正确闭合 四、解决方案与预防措施1. 检查语法元素2. 正确使用符号和字符3. 修正 JSON 格式4. 字符串闭合 五、示例代码和实践建议…...
oracle数据库的plsql免安装版安装
这个是连接oracle数据库的,注意安装不能有中文路径。以下只是示例。 1、打开D:\ruanjian\plsql\plsql\plsql,发送plsqldev.exe快捷方式到桌面。 2、新弹出的页面填写cancel,什么也不写。 3、将instanceclient解压,并复制文件路径。 修改tool…...
stm32使用通用定时器生成pwm
Driver_TIM5.c 通用定时器的通道1和2可以做时钟源 #include "Driver_TIM5.h"void Driver_TIM5_Init(void) {/* 1. 开启时钟*//* 1.1 定时器5的时钟 */RCC->APB1ENR | RCC_APB1ENR_TIM5EN;/* 1.2 GPIO的时钟 PA */RCC->APB2ENR | RCC_APB2ENR_IOPAEN;/* 2. 设…...
老物件线上3D回忆展拓宽了艺术作品的展示空间和时间-深圳华锐视点
在数字技术的浪潮下,3D线上画展为艺术家们开启了一个全新的展示与销售平台。这一创新形式不仅拓宽了艺术作品的展示空间,还为广大观众带来了前所未有的观赏体验。 3D线上画展制作以其独特的互动性,让艺术不再是单一的视觉享受。在这里&#x…...
对于多个表多个字段进行查询、F12查看网页的返回数据帮助开发、数据库的各种查询方式(多对多、多表查询、子查询等)。
对于多个表多个字段进行查询、F12查看网页的返回数据帮助开发、数据库的各种查询方式(多对多、多表查询、子查询等)。 一、 前端界面需要展现多个表的其中几个数据的多表查询。1. 三个表查询其中字段返回:(用一下sql语句ÿ…...
护网HW面试常问——组件中间件框架漏洞(包含流量特征)
apache&iis&nginx中间件解析漏洞 参考我之前的文章:护网HW面试—apache&iis&nginx中间件解析漏洞篇-CSDN博客 log4j2 漏洞原理: 该漏洞主要是由于日志在打印时当遇到${后,以:号作为分割,将表达式内容分割成两部…...
招投标数据采集:为企业决策提供数据支持
在当今数据驱动的时代,招投标信息作为行业竞争情报的重要组成部分,正日益成为企业制定战略决策的关键依据。本文将深入探讨招投标数据采集的重要性,以及它如何为企业决策提供强有力的数据支持,同时揭秘如何高效、精准地获取这些数…...
02:项目二:感应开关盖垃圾桶
感应开关盖垃圾桶 1、PWM开发SG901.1、怎样通过C51单片机输出PWM波?1.2、通过定时器输出PWM波来控制SG90 2、超声波测距模块的使用3、感应开关盖垃圾桶 需要材料: 1、SG90舵机模块 2、HC-SR04超声波模块 3、震动传感器 4、蜂鸣器 5、若干杜邦线 1、PWM开…...
eNsp公司管理的网络NAT策略搭建
实验拓扑图 实验需求: 7,办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 8,分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 9,多出口环境基于带…...
MUR2060CTR-ASEMI无人机专用MUR2060CTR
编辑:ll MUR2060CTR-ASEMI无人机专用MUR2060CTR 型号:MUR2060CTR 品牌:ASEMI 封装:TO-220 批号:最新 最大平均正向电流(IF):20A 最大循环峰值反向电压(VRRM&#…...
Manim的代码练习02:在manim中Dot ,Arrow和NumberPlane对象的使用
Dot:指代点对象或者表示点的符号。Arrow:指代箭头对象,包括直线上的箭头或者向量箭头等。NumberPlane:指代数轴平面对象,在Manim中用来创建包含坐标轴的数学坐标系平面。Text:指代文本对象,用来…...
datawhale - 基于术语词典干预的机器翻译挑战赛 (一)
文章目录 torchtext 库是干什么用的 ?TranslationDataset 类定义 Seq2Seq模型EncoderDecoderSeq2Seq 类 load_terminology_dictionary 函数示例用法 train 函数主程序代码模型评价load_sentences 函数translate_sentence 函数evaluate_bleu 函数主程序 测试集上进行…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
