你们好,以前写(shui)了两篇其余类型的文章,感受你们反响不是很好,因而我乖乖的回来更新硬核技术文了。git
通过本系列前两篇文章咱们了解到日志框架大战随着 SLF4j 的一统天下而落下帷幕,但 SLF4j 仅仅是接口,实现方面, logback 与 log4j2 仍然难分高下,今天咱们就来聊一聊,日志框架实现究竟是该选择 Log4j2 仍是 Logback。这篇文章咱们将从功能、API 设计、可扩展性、性能四个方面展开讨论。程序员
老牌的 Log4j2 凭借着入场早、背靠 Apache 两大优点有着不错的用户支持,官网文档也很完善。github
新生的 Logback 凭借着 SLF4j 的原生实现以及被 Spring Boot 钦点的日志框架(Spring 也提供了Log4j2 的 starter,切换依赖便可完成更换日志框架,前文讲过,此处再也不赘述),一样也拥有着很好的前景。数据库
社区支持方面,Log4j2 做为 Apache 顶级项目,支持度应该是很不错的,Logback 做为Ceki创业后的产物,也能有很好的保证,两者生态可谓不相上下。框架
日志的功能咱们从使用者的角度能够分为:配置、使用、以及独有特性。异步
如前文所说,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 输出日志。测试
日志输出格式:ui
logback:%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] %-40.40logger{39} : %m%n
lua
Log4j2:%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] %-40.40c{1.} : %m%n
测试结果以下:
从测试结果来看两者差别并不大,吞吐量表现上,同步输出在单线程上要好于异步输出,异步输出方面,Log4j2 要优于Logback;响应时间表现上,两者不管同步、异步差距都不大,而且都表现为线程越多响应越慢,应该是线程切换和加锁开销所致,值得一提的是,异步输出时 CPU 使用率会更高一点。
Logback 使用更简单、Log4j2 功能更强大,若是不是深度使用,二者并不会有太大差异,而且在使用SLF4j的时候能够无缝切换。我的建议,没必要纠结选型,按照偏好选择便可。测试源码已上传 github,下一篇咱们来说解原理以及如何扩展动态调整日志输出级别。
Java 程序员十分“幸运”的不须要作技术选型:初级程序员没能力选型,中级程序员常用已经选择好的技术,高级程序员只能选择 CTO 或者客户指定的技术。
以上是我的观点,若是有问题或错误,欢迎留言讨论指正,码字不易,若是以为写的不错,求关注、求点赞、求转发。
扫码关注公众号,第一时间得到更新