大家好,之前写(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;

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

测试结结果:

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

总结

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

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

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

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

2020 年了,Java 日志框架到底哪个性能好?——技术选型篇的更多相关文章

  1. Java日志框架那些事儿

    文章首发于[博客园-陈树义],点击跳转到原文Java日志框架那些事儿. 在项目开发过程中,我们可以通过 debug 查找问题.而在线上环境我们查找问题只能通过打印日志的方式查找问题.因此对于一个项目而 ...

  2. Java程序员最常用的8个Java日志框架

    转自:http://www.codeceo.com/article/8-java-log-framework.html 作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用 ...

  3. 转:Java程序员最常用的8个Java日志框架

    作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用以及移动应用.然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日志可以帮助我们更好更快地定位bug:在 ...

  4. Java 日志框架终极教程

    概述 对于现代的 Java 应用程序来说,只要被部署到真实的生产环境,其日志的重要性就是不言而喻的,很难想象没有任何日志记录功能的应用程序被运行于生产环境中.日志 API 所能提供的功能是多种多样的, ...

  5. Java基础学习总结(40)——Java程序员最常用的8个Java日志框架

    作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用以及移动应用.然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日志可以帮助我们更好更快地定位bug:在 ...

  6. Java日志框架总结

    1. 前言 从写代码开始,就陆陆续续接触到了许多日志框架,较常用的属于LOG4J,LogBack等.每次自己写项目时,就copy前人的代码或网上的demo.配置log4j.properties或者lo ...

  7. Java-最常用的Java日志框架整理

    Java-最常用的Java日志框架整理 前言 Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用以及移动应用.然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日 ...

  8. java日志框架系列(4):logback框架xml配置文件语法

    1.xml配置文件语法 由于logback配置文件语法特别灵活,因此无法用DTD或schema进行定义. 1.配置文件基本结构 配置文件基本结构:以<configuration>标签开头, ...

  9. java基础-网络编程(Socket)技术选型入门之NIO技术

    java基础-网络编程(Socket)技术选型入门之NIO技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传统的网络编程 1>.编写socket通信的MyServer ...

随机推荐

  1. poj 3181 Dollar Dayz(完全背包)

    Dollar Dayz Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5419   Accepted: 2054 Descr ...

  2. Codeforces Round #183 (Div. 2)

    A. Pythagorean Theorem II 暴力,\(O(n^2)\). B. Calendar 每个日期计算到0年1月1日的天数,相当于转化成前缀和形式. 闰年数计算\[\lfloor\fr ...

  3. 《Netty权威指南》(一)简单的时间服务器P69

    由于该书是基于Netty5编写的样例代码,而Netty5已经被官方废弃. 目前基于推荐版的4.1.12.Final在学习过程中,可能会出现个别接口不一致的情况.所以记录可在4.1.12下编译通过的代码 ...

  4. 浅谈集合框架四——集合扩展:集合循环输出方式及list输出方式的效率对比

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...

  5. H5 拖拽元素

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. @ENABLEWEBSECURITY和@ENABLEWEBMVCSECURITY有什么区别?

    @EnableWebSecurity和@EnableWebMvcSecurity有什么区别? @EnableWebSecurity JavaDoc文档: 将此注释添加到@Configuration类中 ...

  7. 【58.33%】【codeforces 747B】Mammoth's Genome Decoding

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  8. MVC,MVP,MVVM基本原理

    MVC,MVP,MVVM基本原理 模式与框架,其诞生就是为了解决日益复杂的事务处理 当同一问题不断出现,人们就会总结细分出相应的问题解决办法 当需求变得庞大的时候,就会出现细分,在细分的过程中就会出现 ...

  9. Java中try catch finally执行

    直接上代码实例: public static void main(String[] args) {    System.out.println(test1()); } static int test1 ...

  10. ZR1153

    ZR1153 首先我们可以发现一个比较简单的容斥做法 直接暴力枚举\(2^m\)个限制强制不合法,算贡献 注意如果两个限制冲突那么答案为0 直接暴力差分就好了 这样就有了快乐的\(30\)分了 接下来 ...