欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

2020 年了,Java 日志框架到底哪个性能好?——技术选型篇

程序员文章站 2022-06-05 17:00:17
大家好,之前写(shui)了两篇其他类型的文章,感觉大家反响不是很好,于是我乖乖的回来更新硬核技术文了。 经过本系列前两篇文章我们了解到日志框架大战随着 SLF4j 的一统天下而落下帷幕,但 SLF4j 仅仅是接口,实现方面, logback 与 log4j2 仍然难分高下,今天我们就来聊一聊,日志 ......

大家好,之前写(shui)了两篇其他类型的文章,感觉大家反响不是很好,于是我乖乖的回来更新硬核技术文了。

经过本系列前两篇文章我们了解到日志框架大战随着 slf4j 的一统天下而落下帷幕,但 slf4j 仅仅是接口,实现方面, logback 与 log4j2 仍然难分高下,今天我们就来聊一聊,日志框架实现到底是该选择 log4j2 还是 logback。这篇文章我们将从功能、api 设计、可扩展性、性能四个方面展开讨论。

生态

老牌的 log4j2 凭借着入场早、背靠 apache 两大优势有着不错的用户支持,官网文档也很完善。

新生的 logback 凭借着 slf4j 的原生实现以及被 spring boot 钦点的日志框架(spring 也提供了log4j2 的 starter,切换依赖即可完成更换日志框架,前文讲过,此处不再赘述),同样也拥有着很好的前景。

社区支持方面,log4j2 作为 apache *项目,支持度应该是很不错的,logback 作为ceki创业后的产物,也能有很好的保证,二者生态可谓不相上下。

功能

日志的功能我们从使用者的角度可以分为:配置、使用、以及独有特性。

  • 配置文件方面,log4j 提供了更多的配置文件配置方式,log4j2 支持 properties、yaml、json、xml四种,logback 则支持 xml 与 groovy 两种方式;
  • appender 方面,两者均支持自定义扩展 appender ,log4j2 并且提供了几乎全部场景的 appender,文件、控制台、jdbc、nosql、mq、syslog、socket、smtp等,logback提供 appender 略少于 log4j2,提供了文件、控制台、数据库、syslog、socket、smtp等,动态化输出方面,log4j2 提供了scriptappenderselector,logback 则提供了 evaluator 与 siftingappender(两者均可以用于判断并选择对应的 appender);
  • 独有特性方面,logback 支持 receivers, 可以接收其他 logback 的 socket appender 输出,logbak 还拥有 logback-access 模块,可以用来与 servlet容器(如 tomcat 和 jetty)集成,提供 http 访问日志功能;log4j2 则拥有号称能够减少 jvm 垃圾回收停顿时间的 garbage-free(无垃圾模式),log4j2 api 支持使用 java 8 lambda,slf4j 则在 2.0 版本提供流式(fluent)api 同时支持 lambda;

2020 年了,Java 日志框架到底哪个性能好?——技术选型篇

api 设计及可扩展性

如前文所说,slf4j 则在 2.0 版本提供流式(fluent)api ,届时logback将会原生实现(理论上会比动态转译过去要好),而 log4j2 并没有提供支持。扩展方面,logback 采用配置文件中直接写对应实现(class="ch.qos.logback.core.rolling.rollingfileappender")来自定义实现扩展,log4j2 采用插件机制,无需配置,但比较复杂,个人认为 logback 反而清晰一些。

性能

性能方面,log4j2 官网有很好的性能测试报告,结果是 log4j2 完胜,本着严谨的态度,员外认为还要自己来测试一下,使用了 jmh 进行同步和异步输出文件测试,测试一分钟,无预热,采用文件滚动模式,gzip压缩,总计输出(gzip压缩后) 700~900 mb 左右,测试版本: # logback 1.2.3,# log4j 2.13.0,# slf4j 1.7.30,# jmh version: 1.22 # jdk 1.8.0_232,测试过程中二者都使用了slf4j 作为 api 输出日志。

日志输出格式:

  • logback:%d{yyyy-mm-dd hh:mm:ss.sss} %5p [%t] %-40.40logger{39} : %m%n

  • log4j2:%d{yyyy-mm-dd hh:mm:ss.sss} %5p [%t] %-40.40c{1.} : %m%n

测试结结果:

2020 年了,Java 日志框架到底哪个性能好?——技术选型篇

2020 年了,Java 日志框架到底哪个性能好?——技术选型篇

从测试结果来看二者差异并不大,吞吐量表现上,同步输出在单线程上要好于异步输出,异步输出方面,log4j2 要优于logback;响应时间表现上,二者无论同步、异步差距都不大,并且都表现为线程越多响应越慢,应该是线程切换和加锁开销所致,值得一提的是,异步输出时 cpu 使用率会更高一点。

总结

logback 使用更简单、log4j2 功能更强大,如果不是深度使用,两者并不会有太大差别,并且在使用slf4j的时候可以无缝切换。个人建议,不必纠结选型,按照偏好选择即可。测试源码已上传 github,下一篇我们来讲解原理以及如何扩展动态调整日志输出级别。

java 程序员十分“幸运”的不需要做技术选型:初级程序员没能力选型,中级程序员经常使用已经选择好的技术,高级程序员只能选择 cto 或者客户指定的技术。

以上是个人观点,如果有问题或错误,欢迎留言讨论指正,码字不易,如果觉得写的不错,求关注、求点赞、求转发。

扫码关注公众号,第一时间获得更新

 

2020 年了,Java 日志框架到底哪个性能好?——技术选型篇