Java开源日志框架大比拼

译文
开发 后端
应用系统中,日志是不可缺少的重要组成部分,所有的应用的出错信息等都应该能在日志文件中查找到,有的应用系统日志可能数量很小,有的庞大的应用系统的日志是相当庞大,同时日志文件必须是方便用户定制和查找的,要具备很高的性能,否则会影响应用系统的性能。

[[107559]]

应用系统中,日志是不可缺少的重要组成部分,所有的应用的出错信息等都应该能在日志文件中查找到,有的应用系统日志可能数量很小,有的庞大的应用系统的日志是相当庞大,同时日志文件必须是方便用户定制和查找的,要具备很高的性能,否则会影响应用系统的性能。

由 于日志通常涉及到IO读写磁盘(或者是阻塞或者是异步),这都要耗费时间。当在大型系统中有大量数据的时候,日志所耗费的时间就会显现。在本文中,将深入 探讨目前Java开源世界中领先的五个日志框架,在各个方面进行比较,要指出的是,本文并不是探究哪个日志框架是***秀的,而只是列出各自的优缺点。

我们选取的五个日志框架分别为:

1. Log4J

2. Log4J2

3. Logback

4. SLF4J Simple Logging (SLF4J SL)

5. Java Util Logging (JUL)

我们想对比下这些日志框架对于基本的日志记录活动的性能如何,每一个日志操作包括时间戳和其上下文的进程ID。我们进行如下四个方面的测评:

1.记录字符串常量

2. Logging the .toString() value of a POJO 对POJO使用.toString()方法

3. Logging a throwable object 记录throwable对象4 只测试.toString()方法

我们决定为每种场景进行五次的评测,通过衡量完成日纸记录的操作次数,以决定哪一个有***的成绩。在每次测试中让日志引擎在一分钟内使用10个线程去执行,并且剔除***的2次偏差,将余下的三次进行平均。

在每一个单独的日志记录操作中,我们让CPU在日志记录的时候都执行一些操作(如检查是否一个随机数是否素数)。这些评测的日志引擎都使用各自的默认配置通过SLF4J来运行。评测是在Amazon m1.large EC2实例上进行的。

在 Log4j2的刚开始的测试中,我们设置了%C的布局参数(参考:http://logging.apache.org/log4j/2.x /manual/layouts.html),这增加了其开销,在@RemkoPopma的建议下,我们更新了设置为%c(日志的名称)以符合其他的配 置,这给Log4j2一个性能相当大的提升,在下面两个图中,值得注意的是记录上下文的性能开销。

使用%C的设置:

使用%C的设置:


 

完整的测试结果集参考这个链接:https://docs.google.com/spreadsheet/ccc?key=0Alceaf46X4GPdHBoLTdYQ29nRDh6V1dRY00zT1FwWWc&usp=sharing

下面对基于4个场景的测试结果进行具体分析:

一 字符串常量

在 这轮比拼中,需要日志引擎使用线程和时间戳上下文去记录字符串常量。Log4j是冠军,比JUL能多写270%的日志行,比logback多12.5%, 比SLF4J SL多52%。有趣的是在我们改变log4j2的配置前,它写的行数能是比改变后的1/4左右,在更改配置后,性能排在第三位,只比logback记录的 行数少30%。

二.toString()

在 这轮比拼中记录的是POJO(使用其.toString方法),同样使用的是线程和时间戳。结果中,对于Log4j2来说,和***回合差不多,但相比 SLF4J SL有25%的性能提升。Log4j和Logback是并驾齐驱的,位居第三,其吞吐量是SLF4J SL的88%。

三.Throwable

在这轮比拼中,日志引擎记录异常的对象和相关的描述信息。其中Log4j2是位居首位,其性能比SLF4J SL高3倍,SLF4J SL位于第五位。

而Log4j和Logback也是只能排在此轮的冠军之后,记录的行数只大概有冠军的一半,而第二位的反而是JUL,能记录冠军Log4j2的日志量的大概82%。

四.toString()方法比拼

当 处理服务器日志的时候,每一个日志项的上下文(例如线程ID,类的相关上下文,时间戳等等)都是和日志内容一样重要。在之前的测试中,使用的是在大多数日 志文件中常见的标志――线程ID号和时间戳。接下来我们认为值得去分析单纯在日志中使用.toString()方法的性能。

这个时候,Log4j2是赢家(如果改变配置,能获得180%的性能提升),赢出Logback和JUL 大概25%。SL4FJ SL则落败。在每轮的五次测试中,SLF4J SL在启用appenders的时候性能比不启用要好。

Log4j在吞吐量上有15%的增加。JUL在这轮比拼中比不上Log4j和Log4j2,其结果和不使用上下文数据是一样的。

本文的测试代码可以在https://github.com/takipi/the-logging-olympics中下载。

原文链接:http://www.takipiblog.com/2013/12/18/the-logging-olympics-a-race-between-todays-top-5-logging-frameworks/

 

责任编辑:陈四芳 来源: 51CTO
相关推荐

2021-03-02 09:00:00

开源框架技术

2011-01-19 11:10:30

2010-03-18 14:54:46

主流无线技术

2020-08-04 17:06:40

Merging Rebasing Git

2010-07-14 13:38:51

Perl开发工具

2010-05-28 11:09:51

SVN功能

2017-09-10 14:29:03

眼力

2010-08-25 16:12:34

职场

2010-09-08 15:41:28

SIP协议栈

2011-11-08 10:29:44

2021-03-15 21:07:17

IT行业薪酬薪水

2023-05-26 15:53:48

MidjourneyAI图像

2010-08-05 14:25:30

Flex框架

2017-02-05 17:10:41

机器学习深度学习框架

2023-11-14 09:00:00

向量数据库ChromaMilvus

2010-04-21 12:54:46

Unix内核

2019-03-29 08:25:21

JSONXML前端

2018-10-25 14:08:07

KubernetesGoogle

2011-04-01 09:18:01

MRTGCactiZabbix

2019-08-27 09:00:00

敏捷开发开发方法项目
点赞
收藏

51CTO技术栈公众号