log4j与log4j2性能对比及log4j升级至log4j2方案

article/2025/9/18 16:44:10

1.前言

  • 之前某个服务在压测环境中出现了问题,分析之后得知是log4jLogger对象争用厉害,很多线程阻塞在此。

  • 以上问题证明log4j在高并发高QPS情况下,是存在性能问题的。

  • 之后把log4j升级成了log4j2,并采取异步日志模式,解决了因日志造成的性能问题。

2.性能对比

关于log4j与log4j2的性能对比文章有很多,本文不过多描述,给出几张结论图及原文链接,作为参考。

  1. Log4j1、Logback 以及 Log4j2 性能测试对

    在这里插入图片描述
    上述图片由原文作者【ksfzhaohui】提供,特此感谢!

  2. logback log4j log4j2 性能实测

    在这里插入图片描述
    上述图片由原文作者【专注服务端】提供,特此感谢!

  3. 高性能队列——Disruptor

    在这里插入图片描述
    上述图片由原文作者【宫铭】提供,特此感谢!

3.相关知识

  • 和日志相关的概念有:log4j、log4j2、logback、commons-logging、slf4j
  • 其中,log4j、log4j2、logback、commons-logging都是日志的具体实现包。
  • 其中,slf4j是一个门面,一个适配器,所有的日志代码都可以用slf4j来写,它会根据项目具体依赖的日志实现包进行日志操作。
  • 通过slf4j写日志的好处是,当更换日志的实现方案时,无需修改日志代码,只需修改pom.xml即可。
  • 推荐:通过slf4j写日志。
  • 推荐:通过lombok的@Slf4j注解写日志。

4.log4j升级至log4j2

4.1.排除旧的日志实现包

  • 因为每个项目的pom.xml多种多样,所以无法总结统一的排除方案,这里只汇总需要排除的包。

  • 也就是说,如果你的项目里有以下包,应该排除。

<exclusions><!-- log4j 相关包 --><exclusion><artifactId>log4j</artifactId><groupId>log4j</groupId></exclusion><exclusion><groupId>org.slf4j</groupId><artifactId>log4j</artifactId></exclusion><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion><!-- log4j 的springboot starter --><exclusion><artifactId>spring-boot-starter-log4j</artifactId><groupId>org.springframework.boot</groupId></exclusion><!-- logback 相关包 --><exclusion><artifactId>logback-classic</artifactId><groupId>ch.qos.logback</groupId></exclusion><exclusion><artifactId>logback-core</artifactId><groupId>ch.qos.logback</groupId></exclusion><!-- slf4j 相关包 --><exclusion><artifactId>slf4j-log4j12</artifactId><groupId>org.slf4j</groupId></exclusion><exclusion><artifactId>log4j-to-slf4j</artifactId><groupId>org.apache.logging.log4j</groupId></exclusion><exclusion><artifactId>slf4j-api</artifactId><groupId>org.slf4j</groupId></exclusion>
</exclusions>

4.2.增加log4j2的依赖包

<!-- log4j2的api、core和web包 -->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.11.1</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.11.1</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-web</artifactId><version>2.11.1</version>
</dependency>
<!-- slf4j与log4j2的连接包 -->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.11.1</version>
</dependency>
<!-- log4j与log4j2的连接包 -->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-1.2-api</artifactId><version>2.11.1</version>
</dependency>
<!-- log4j2支撑完全异步模式的关键api -->
<dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.4.2</version>
</dependency>
<!-- slf4j本身的api -->
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId>
</dependency>

4.3.修复编译报错

  • 如果之前代码中日志都是直接通过log4j编写的,则可能需要修改import路径。
  • 在log4j版本,Logger的包路径是org.apache.log4j
  • 在log4j2版本,Logger的包路径是org.apache.logging.log4j

4.4.替换日志配置文件

  • 在log4j版本,配置文件为log4j.xml或者log4j.properties。

  • 在log4j2版本,配置文件为log4j2.xml。

  • 在log4j2版本,支持三种异步方式:Sync(同步)、Async Appender(混合异步)和Loggers All Async(全异步),其性能优势依次递增。

  • 下面给出一份全异步的参考配置。

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration status="error" monitorInterval="30"><Properties><Property name="baseDir">log</Property></Properties><!--先定义所有的appender--><appenders><!--这个输出控制台的配置--><Console name="Console" target="SYSTEM_OUT"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="%d %5p %c:%L - %m %throwable{}%n"/></Console><!--异步日志配置,指向配置引用AppenderRef--><Async name="ASYNC" bufferSize="262144" includeLocation="true"><AppenderRef ref="RollingFile"/></Async><!--日志文件配置,filePattern为日志文件名称的格式--><RollingFile name="RollingFile" fileName="${baseDir}/info.log" filePattern="${baseDir}/info.log.%d{yyyy-MM-dd}"><!--日志内容格式--><PatternLayout pattern="%d %5p %c:%L - %m %throwable{separator( --> )}%n"/><!--依据时间创建新的日志文件:1d--><TimeBasedTriggeringPolicy interval="1"/><DefaultRolloverStrategy><!-- 在轮转时,删除7天之前的,命名符合规则的文件 --><Delete basePath="${baseDir}"><IfFileName glob="info.log.*"/><IfLastModified age="7d"/></Delete></DefaultRolloverStrategy></RollingFile></appenders><!--然后定义logger,只有定义了logger并引入的appender,appender才会生效--><loggers><root level="INFO"><appender-ref ref="Console"/><appender-ref ref="RollingFile"/></root><!--这里配置 过滤日志 --><logger name="org.hibernate.validator" level="ERROR"/></loggers>
    </configuration>
    

http://chatgpt.dhexx.cn/article/a0Ki7HyC.shtml

相关文章

日志框架LOG4J2系列二——log4j2配置文件

日志框架LOG4J2系列二——log4j2配置文件 一、log4j2支持的配置文件格式二、log4j2.xml配置文件三、log4j2.xml配置项详解总结上一节:日志框架LOG4J2系列一——入门 在上一节留下了两个疑问: 1、为什么日志输出到控制台,如何输出到文件中? 2、日志的格式为什么是这样的? 要…

SpringBoot 项目中使用Log4j2详细(避坑)

以下部分内容转载整理自 log4j2 实际使用详解_vbirdbest的博客-CSDN博客_log4j2 &#xff0c;感谢 vbirdbest 的相关知识分享 首先&#xff0c;认识一下三胞胎 log4j 是apache实现的一个开源日志组件logback 同样是由log4j的作者设计完成的&#xff0c;拥有更好的特性&#x…

Log4j2漏洞

2021/12/15漏洞更新如下 官方链接CVE&#xff1a;http://cve.scap.org.cn/vuln/VHN-408570 安全公告编号:CVE-2021-45046发现 Apache Log4j 2.15.0 中针对 CVE-2021-44228 的修复在某些非默认配置中不完整。当日志配置使用带有上下文查找&#xff08;例如&#xff0c;$${ctx:l…

Log4j2-Log4j 2介绍及使用

Log4j 2 官网Log4j 2简介架构日志级别FilterAppender 将日志请求打印到多个目标Layout 自定义输出格式转到Log4j 2 API 控制台Appender的简单配置文件Appender的简单配置SocketAppenderAsyncAppender控制台和文件的AsyncAppender 配置Log4j 2使用Log4j 2 Log4j 2 官网 https:/…

log4j2 使用详解

转载自 Blog of 天外的星星&#xff1a; http://www.cnblogs.com/leo-lsw/p/log4j2tutorial.html Log4j 2的好处就不和大家说了&#xff0c;如果你搜了2&#xff0c;说明你对他已经有一定的了解&#xff0c;并且想用它&#xff0c;所以这里直接就上手了。 1. 去官方下载log4j …

一问三不知之log4j2漏洞简析

1.log4j2漏洞介绍 1.1简介 Apache Log4j 2是对Log4j的升级&#xff0c;它比其前身Log4j 1.x提供了重大改进&#xff0c;并提供了Logback中可用的许多改进&#xff0c;同时修复了Logback架构中的一些问题。是目前最优秀的Java日志框架之一。 2021年11月24日&#xff0c;阿里云…

Log4j2使用详解

日志框架简单比较&#xff08;slf4j、j.u.l、log4j、logback、log4j2 &#xff09; slf4j&#xff1a;slf4j是对所有日志框架制定的一种规范、标准、接口&#xff0c;并不是一个框架的具体的实现&#xff0c;因为接口并不能独立使用&#xff0c;需要和具体的日志框架实现配合使…

log4j2配置参数详解

1.概述 JAVA常用的日志收集api和实现框架都有多种&#xff0c;不同的api和实现框架之间怎么相互兼容都比较复杂&#xff0c;不过大部分的日志框架实现也都提供了对其他日志收集方式的兼容和切换&#xff08;可以参考slf4j、jcl、jul、log4j1、log4j2、logback大总结 - 乒乓狂魔…

Log4j2详解

1.背景 Log4j 2中记录日志的方式有同步日志和异步日志两种方式&#xff0c;其中异步日志又可分为使用AsyncAppender和使用AsyncLogger两种方式。 2.Log4j2中的同步日志 所谓同步日志&#xff0c;即当输出日志时&#xff0c;必须等待日志输出语句执行完毕后&#xff0c;才能执…

log4j2 的使用【超详细图文】

log4j2 的使用 Apache Log4j2 是对Log4j 的升级版本&#xff0c;参考了logback 的一些优秀的设计&#xff0c;并且修复了一些问题&#xff0c;因此带来了一些重大的提升&#xff0c;主要有&#xff1a; 异常处理&#xff0c;在logback中&#xff0c;Appender中的异常不会被应…

Log4j2 简介

介绍 Log4j2是Log4j的升级版&#xff0c;与之前的版本Log4j 1.x相比、有重大的改进&#xff0c;修正了Logback固有的架构问题的同事&#xff0c;改进了许多Logback所具有的功能。 特性 一、API 分离 Log4j2将API与实现分离开来。开发人员现在可以很清楚的知道能够使用哪些没有兼…

数据分析方法08用户画像

用户画像 1、 概念 用户画像是指用户信息标签化&#xff0c;通过收集用户多维度的信息数据&#xff08;如人口统计属性&#xff0c;社会属性&#xff0c;行为偏好&#xff0c;消费习惯等&#xff09;&#xff0c;对其进行统计&#xff0c;分析&#xff0c;从而抽象出用户信息…

用户画像及其应用案例分享

一、用户画像基础概念 用户画像&#xff0c;即用户信息标签化&#xff0c;通过收集用户的社会属性、消费习惯、偏好特征等各个维度的数据&#xff0c;对用户特征属性进行刻画&#xff0c;并对这些特征进行分析、统计&#xff0c;挖掘潜在价值信息&#xff0c;从而抽象出用户的…

大数据分析--用户画像

从去年还在北京工作的时候就开始不断的听说&#xff0c;用户画像、用户画像&#xff0c;而且&#xff0c;有个项目&#xff0c;项目领导美其名曰&#xff1a;用户画像&#xff0c;这么长时间&#xff0c;也没有真正的思考过什么叫用户画像。前几天看到一篇关于这方面的文章&…

【数据分析】京东平台用户画像分析

1.用户信息标签 用户信息的收集包括用户基础要素、用户场景、行为偏好、心理个性、交际等多方面。 可以用静态标签、动态标签两大类来划分。 静态数据:用户相对稳定的信息&#xff0c;主要包括人口属性、商业属性等方面数据&#xff1b;这类信息果企业有真实信息则无需过多建…

用户画像解析

用户画像是大数据行业言必及之的时髦概念。现在我们运营谈及用户画像&#xff0c;它也是和精准营销、精细化运营直接钩挂的。这篇文章主要讲产品和运营角度的用户画像。 一、什么是用户画像 用户画像一点也不神秘&#xff0c;它是根据用户在互联网留下的种种数据&#xff0c;主…

用户画像分析总结

一、 什么是用户画像 用户画像是指根据用户的属性、用户偏好、生活习惯、用户行为等信息而抽象出来的标签化用户模型。通俗说就是给用户打标签&#xff0c;而标签是通过对用户信息分析而来的高度精炼的特征标识。通过打标签可以利用一些高度概括、容易理解的特征来描述用户&…

用户画像详解来了

导读&#xff1a;今天主要和大家分享明略对于用户画像的认识&#xff0c;包括如何理解用户画像&#xff0c;为什么需要用户用画像&#xff0c;以及明略在建设和应用用户画像过程中总结的方法论&#xff0c;让大家了解如何构建好的用户画像。 01 什么是用户画像 首先来看用户画像…

Python的import

Python里面的import语句用于导入一个已经写好的包或者模块 使得自己的程序里面可以使用导入的模块里面的函数、变量等 import name 导入numpy模块&#xff0c;里面有一个shape函数&#xff0c;要使用这个函数&#xff0c;numpy.shape()即可 但是不加numpy就不行&#xff0c;…

python-import this

优美胜于丑陋&#xff08;python 以编写优美的代码为目标&#xff09; 明了胜于晦涩&#xff08;优美的代码应该是明了的&#xff0c;命名规范&#xff0c;风格相似&#xff09; 简洁胜于复杂&#xff08;优美的代码应当是简洁的&#xff0c;不要有复杂的内部实现&#xff09…