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>
    

log4j与log4j2性能对比及log4j升级至log4j2方案相关推荐

  1. Nutanix 替代专题 | SmartX 与 Nutanix 超融合市场、技术与性能对比

    2022 年 8 月 19 日,Nutanix(路坦力)宣布中国市场自 2023 财年起将转型为合作伙伴销售主导模式,引起了广泛关注:同时结合当前 IT 基础架构的国产化趋势背景,不少正在使用和考虑使 ...

  2. 常见日志框架介绍和对比(log4j,logback,log4j2)

    文章目录 1. 什么是slf4j? 2. log4j简介和配置 2.1 log4j介绍 2.2 log4j三大组件 2.3 log4j pom依赖引入 2.4 配置log4j 3. logback简介 ...

  3. Log4j 2:性能接近疯狂

    最近,Apache社区中一位受人尊敬的成员尝试了Log4j 2并在Twitter上写道: @TheASF #log4j2摇摇欲坠 ! 性能接近疯狂^^ http://t.co/04K6F4Xkaa - ...

  4. log4j日志输出性能优化-缓存、异步

    1.log4j已成为大型系统必不可少的一部分,log4j可以很方便的帮助我们在程序的任何位置输出所要打印的信息,便于我们对系统在调试阶段和正式运行阶段对问题分析和定位.由于日志级别的不同,对系统的性能 ...

  5. Excel文件解析性能对比(POI,easyexcel,xlsx-streamer)

    问题: 在解析excel内容时,由于用户误操作,偶尔会误录入大量空行,如果代码处置不当,进行文档内容解析时,就会占用大量时间和内存,甚至引起服务器内存消耗殆尽,导致服务无法访问,或者引起OOM. 解决 ...

  6. 主流日志框架使用及性能对比

    一.摘要 不管是使用何种编程语言,何种框架,日志输出几乎无处不再,也是任何商业软件中必不可少的一部分. 总结起来,日志的用途大致可以归纳成以下三种: 问题追踪:通过日志不仅仅包括我们程序的一些bug, ...

  7. rtx2060什么水平_RTX2060与Super有什么区别?RTX2060和RTX2060 Super性能对比评测

    于2019年7月2日,NVIDIA正式解禁了全新一代的RTX 2060 Super.RTX 2070 Super,我们知道Super的含义是超级的意思,我们也可以理解为性能跳级版,相比此前发布的RTX ...

  8. Log4j 使用方法和输出格式控制--log4j的PatternLayout参数含义

    Log4j 由 Apache 推出的开源免费日志处理的类库 可以控制日志信息输送的目的地是控制台.文件-等 可以控制每一条日志的输出格式 使用时导入 log4j 的 jar 包,并在 src 中 配置 ...

  9. log4j:WARN Error initializing output writer. log4j:WARN Unsupported encoding?

    javaWeb在使用log.4j打印日志文件的时候提示: log4j:WARN Error initializing output writer. log4j:WARN Unsupported enc ...

最新文章

  1. 老婆给当程序员的老公打电话:今天下班顺路买斤元宵……
  2. Java字符编码根本原理
  3. 捡到vivo手机怎么清除账号_大学保安两天两次跳湖为路人捡手机,您怎么看?...
  4. 决策树-熵计算-ID3算法(转)
  5. 2012年下半年我国信息化和信息安全走势分析与预测
  6. 教你10分钟内在Windows上完成Rails开发环境的安装和配置
  7. 基于情感词典、k-NN、Bayes、最大熵、SVM的情感分析比较及优缺点
  8. 小小知识点(十一)——MATLAB中fftshift的作用
  9. bin/arm-linux-androideabi-nm: libtinfo.so.5: cannot open shared object file: No such file or directo
  10. ExtJS在面向对象所作出的努力
  11. 文本挖掘学习笔记(二):文档信息向量化与主题关键词提取
  12. 倒立摆系统的多种控制器设计
  13. matlab之GUI界面设计(1)
  14. c语言初步经典题4----求圆柱体的表面积
  15. 高琪300集——入门
  16. 账户经常被盗号怎么办?防盗“黑科技”了解一下
  17. 优秀的 Node.js 包汇总
  18. 【5. Redis的高并发高可用】
  19. 比你拼命的人多的是,最可怕的是比你牛的人比你还拼命(每天看一段一个月刚刚好)
  20. 【AtCoder】【模拟】【模型转化】Camel and Oases(AGC012)

热门文章

  1. 投屏电视显示无法连接服务器,无法连接服务器.怎么办?
  2. 鸿蒙系统翻车了,华为鸿蒙系统“翻车了”?被质疑抄袭安卓11系统,事实并非如此...
  3. docker 网络模式研究了许久,其实我们需要的是docker run -p 80:80命令
  4. 分享时刻—今日一收获
  5. 事关健康、教育和工资 | 1月起,这些事有变化 |
  6. BI神器Power Query(13)-- PQ制作时间维度表(2)
  7. 利用Filezilla在局域网内搭建自己的FTP服务器
  8. centos 中文乱码_StudingThinking_百度空间
  9. 模拟电路笔记(三)放大器
  10. android点赞取消赞功能吗,Android 仿微博的点赞功能的实现原理(持续点赞再取消)...