Code前端首页关于Code前端联系我们

Log4j2 还是Logback? 2020 年哪个 Java 日志框架性能最好?

terry 2年前 (2023-09-25) 阅读数 52 #后端开发

日志框架之战以SLF4j的统治地位结束,但SLF4j只是一个接口。从实现上来说,logback 和 log4j2 还是很难区分的。今天我们就来说说日志框架的实现是否应该选择Log4j2。Logback之后。在本文中,我们将从功能、API设计、可扩展性和性能四个方面进行讨论。

生态

老牌Log4j2由于进入较早以及得到Apache支持的两大优势,拥有良好的用户支持,而且官网文档也非常齐全。

新的Logback依赖于SLF4j的原生实现和Spring Boot选择的日志框架(Spring还提供了Log4j2的starter。可以通过切换依赖来完成日志框架的替换。上面已经说过了,我就不说了在这里重复一下)。它也有良好的前景。

在社区支持方面,Log4j2作为Apache顶级项目,应该有非常好的支持。Logback作为切基创业精神的产物,也能有很好的保障。两者的生态具有可比性。

功能

日志的功能可以从用户的角度来划分:配置、使用和独特功能。

  • 关于配置文件,Log4j提供了更多的配置文件配置方式。 Log4j2 支持属性、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接收器,可以接收其他Logback套接字appender输出。 Logbak还有一个logback访问模块,可以用来与servlet容器(如Tomcat、Jetty)集成,提供http访问日志记录功能; Log4j2有一个功能,声称可以减少JVM垃圾暂停时间。 Garbage-free(无垃圾模式),Log4j2 API支持使用Java 8 lambda,SLF4j在2.0版本中提供了流式(Fluent)API,也支持lambda;
Log4j2 还是 Logback?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~900MB,测试版本:#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

    测试结果如下如下:

Log4j2 还是 Logback?2020 年Java 日志框架到底哪个性能好?Log4j2 还是 Logback?2020 年Java 日志框架到底哪个性能好?

从测试结果来看,两者并没有太大区别。从吞吐性能来看,单线程上同步输出优于异步输出。异步输出方面,Log4j2优于Logback;在响应时间性能方面,同步和异步差距并不大,而且线程越多响应越慢。这应该是线程切换和锁定开销造成的。值得一提的是,异步输出时CPU占用率会较高。

总结

Logback 更容易使用,Log4j2 更强大。如果不深入使用的话,两者没有太大区别,使用SLF4j时可以无缝切换。我个人的建议是,大家不用担心选择型号,根据自己的喜好选择即可。测试源码已上传至github。下一篇我们会讲解原理以及如何扩展和动态调整日志输出级别

Java程序员非常“幸运”,不需要进行技术选型:初级程序员无法选择技术,中级程序员往往使用已经选好的技术,高级程序员只能选择CTO或客户指定的技术。

链接:https://juejin.im/post/5e1e6101f265da3e11359cb4
来源:掘金
版权归作者所有。如需商业转载,请联系求作者授权。非商业转载请来源。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门