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

摘要:
经过本系列前两篇文章我们了解到日志框架大战随着SLF4j的一统天下而落下帷幕,但SLF4j仅仅是接口,实现方面,logback与log4j2仍然难分高下,今天我们就来聊一聊,日志框架实现到底是该选择Log4j2还是Logback。社区支持方面,Log4j2作为Apache顶级项目,支持度应该是很不错的,Logback作为Ceki创业后的产物,也能有很好的保证,二者生态可谓不相上下。

大家好,之前写(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 日志框架到底哪个性能好?——技术选型篇第1张

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 日志框架到底哪个性能好?——技术选型篇第2张

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

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

总结

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

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

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

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

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

免责声明:文章转载自《2020 年了,Java 日志框架到底哪个性能好?——技术选型篇》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇11-linux基础八-正则表达式mount命令详解及常见问题汇总下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

红米手机使用应用沙盒一键修改经纬度数据

之前文章介绍了怎么在安卓手机上安装激活Xposed框架,Xposed框架的强悍功能各位都知道,能不修改apk的前提下,修改系统底层的参数,比如在某些应用范畴,各位需要修改手机的某个系统参数,此时就需要使用Xposed以及相关模块功能来实现。今天记录一下具体xposed框架的下载和框架模块应用沙盒的使用流程,成功激活并正确修改经纬度参数。首先,关于XPose...

把在程序中的System.out.print()的信息自动转成log4j日志信息

问题:老的系统中,程序未使用log4j,而是使用System.out.println()将信息打印到了tomcat。现在客户提出要保存打印到tomcat的日志信息,引入log4j固然需要,但修改代码及后续测试的工作量与风险也让人头大。如何解决这样的问题呢?  回答:System.setOut(PrintStream ps)方法允许程序员自行定义Syst...

3、YishaAdmin开源框架搭建

框架:vs2019、.net core 3.1 SDK 下载地址:https://github.com/liukuo362573/YiShaAdmin 数据库: 1). MySql >= 5.7 (本项目选择mysql数据库) 2). SqlServer >= Sql Server 2012 3). Oracle >= Oracle DB...

CI框架入门笔记

PS - 个人博客原文:CI框架入门笔记 当前(2019-03-22)CodeIgniter 框架的最新版本是 3.1.5,于2017年6月发布,距今快两年了也没有更新,这与 Laravel 的更新速度相比差距太大了。因为确实,它是一个很古老的框架了(第一个版本在2006年发布),当初的设计原则,开发环境与现在都已经大为不同。它有自己的设计原则,有相配套的...

C#开源项目大全

更多内容请访问 www.uusystem.com 商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow 【免费】正则表达式测试工具-Regex-Tester Windows-Phone-7-SDK Excel-读写组件-ExcelLibrary .NET集成开发环境-MonoDevelop 电话软交...

Log4j 日志

日志是应用软件中不可缺少的部分,Apache的开源项目Log4j是一个功能强大的日志组件,提供方便的日志记录。Log4j是Apache基金会的一个项 目,Log4j是一个基于Java的日志组件,Log4j是Java的几个日志框架中的一种。日志记录器(Logger)是日志处理的核 心组件。log4j具有6种一般的日志级别(Level)。 日志记录器(Logg...