写点什么

Java 日志性能那些事

  • 2015-05-26
  • 本文字数:2177 字

    阅读完需:约 7 分钟

在任何系统中,日志都是非常重要的组成部分,它是反映系统运行情况的重要依据,也是排查问题时的必要线索。绝大多数人都认可日志的重要性,但是又有多少人仔细想过该怎么打日志,日志对性能的影响究竟有多大呢?今天就让我们来聊聊 Java 日志性能那些事。

说到 Java 日志,大家肯定都会说要选择合理的日志级别、合理控制日志内容,但是这仅是万里长征第一步……哪怕一些DEBUG级别的日志在生产环境中不会输出到文件中,也可能带来不小的开销。我们撇开判断和方法调用的开销,在 Log4J 2.x 的性能文档中有这样一组对比:

复制代码
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
logger.debug("Entry number: {} is {}", i, entry[i]);

上面两条语句在日志输出上的效果是一样的,但是在关闭DEBUG日志时,它们的开销就不一样了,主要的影响在于字符串转换和字符串拼接上,无论是否生效,前者都会将变量转换为字符串并进行拼接,而后者则只会在需要时执行这些操作。Log4J 官方的测试结论是两者在性能上能相差两个数量级。试想一下,如果某个对象的toString()方法里用了ToStringBuilder来反射输出几十个属性时,这时能省下多少资源。

因此,某些仍在使用 Log4J 1.x 或 Apache Commons Logging(它们不支持{}模板的写法)的公司都会有相应的编码规范,要求在一定级别的日志(比如DEBUGINFO)输出前增加判断:

复制代码
if (logger.isDebugEnabled()) {
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
}

除了日志级别和日志消息,通常在日志中还会包含一些其他信息,比如日期、线程名、类信息、MDC 变量等等,根据 Takipi 的测试,如果在日志中加入class,性能会急剧下降,比起 LogBack 的默认配置,吞吐量的降幅在 6 成左右。如果一定要打印类信息,可以考虑用类名来命名Logger

在分布式系统中,一个请求可能会经过多个不同的子系统,这时最好生成一个 UUID 附在请求中,每个子系统在打印日志时都将该 UUID 放在 MDC 里,便于后续查询相关的日志。《The Ultimate Guide: 5 Methods For Debugging Production Servers At Scale》一文中就如何在生产环境中进行调试给出了不少建议,当中好几条是关于日志的,这就是其中之一。另一条建议是记录下所有未被捕获的日志,其实抛出异常有开销,记录异常同样会带来一定的开销,主要原因是 Throwable类的fillInStackTrace方法默认是同步的:

复制代码
public synchronized native Throwable fillInStackTrace();

一般使用logger.error都会打出异常的堆栈,如果对吞吐量有一定要求,在情况运行时可以考虑覆盖该方法,去掉synchronized native,直接返回实例本身。

聊完日志内容,再来看看Appender。在 Java 中,说起 IO 操作大家都会想起 NIO,到了 JDK 7 还有了 AIO,至少都知道读写加个Buffer,日志也是如此,同步写的Appender在高并发大流量的系统里多少有些力不从心,这时就该使用AsyncAppender了,同样是使用 LogBack:

在 10 线程并发下,输出 200 字符的INFO日志,AsyncAppender的吞吐量最高能是FileAppender的 3.7 倍。在不丢失日志的情况下,同样使用AsyncAppender,队列长度对性能也会有一定影响。

如果使用 Log4J 2.x,那么除了有AsyncAppender,还可以考虑性能更高的异步Logger,由于底层用了 Disruptor ,没有锁的开销,性能更为惊人。根据 Log4J 2.x 的官方测试,同样使用 Log4J 2.x:

64 线程下,异步Logger比异步Appender快 12 倍,比同步Logger68倍。

同样是异步,不同的库之间也会有差异:

同等硬件环境下,Log4J 2.x 全部使用异步Logger会比 LogBack 的AsyncAppender快 12 倍,比 Log4J 1.x 的异步Appender快 19 倍。

(点击放大图像)

Log4J 2.x 的异步Logger性能强悍,但也有不同的声音,觉得这只是个看上去很优雅,只能当成一个玩具。关于这个问题,还是留给读者自己来思考吧。

如果一定要用同步的 Appender,那么可以考虑使用ConsoleAppender,然后将STDOUT重定向到文件里,这样大约也能有 10% 左右的性能提升。

大部分生产系统都是集群部署,对于分布在不同服务器上的日志,用 Logstash 之类的工具收集就好了。很多时候还会在单机上部署多实例以便充分利用服务器资源,这时千万不要贪图日志监控或者日志查询方便,将多个实例的日志写到同一个日志文件中,虽然 LogBack 提供了prudent模式,能够让多个 JVM 往同一个文件里写日志,但此种方式对性能同样也有影响,大约会使性能降低 10%。

如果对同一个日志文件有大量的写需求,可以考虑拆分日志到不同的文件,做法之一是添加多个Appender,同时修改代码,不同的情况使用不同Logger;LogBack 提供了SiftingAppender,可以直接根据 MDC 的内容拆分日志, Jetty 的教程中就有根据host来拆分日志的范例,而根据 Takipi 的测试,SiftingAppender的性能会随着拆分文件数的增长一同提升,当拆分为 4 个文件时,10 并发下SiftingAppender的吞吐量约是FileAppender的 3 倍多。

看了上面这么多的数据,不知您是否觉得自己的日志有不少改进的余地,您还没有把系统优化到极致,亦或者您还有其他日志优化的方法,不妨分享给大家。


感谢丁晓昀对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-05-26 21:1820175
用户头像

发布了 135 篇内容, 共 63.7 次阅读, 收获喜欢 43 次。

关注

评论

发布
暂无评论
发现更多内容

想提升SEO爬虫效率?一套完整SERP抓取解决方案给你!

kookeey代理严选

动态代理 SEO工具 关键词搜索 SEO 优化

京东零售联合易观发布《数智驱动营销升级,寻求确定性增长》白皮书

易观分析

数智化转型 数智驱动 京东零售

AI Agent 十问十答,降低认知摩擦

阿里巴巴云原生

阿里云 云原生

抖音商品详情API接口(附代码示例)

tbapi

抖音API 抖音数据采集 抖音商品详情接口 抖音商品sku接口

数造科技携DataBuilder亮相安徽科交会,展现“DataOps +AI”双引擎魅力

数造万象

大数据 AI 行业资讯 Data 科技

中烟创新入选“2024卓越软件项目优秀案例”

中烟创新

从表格到系统:Classmethod 用 NocoBase 构建员工信息管理系统

NocoBase

开源 低代码 表格 管理工具 员工信息管理

深圳金融科技交流会,探讨AI大模型重塑资管新生态

非凸科技

区块链RWA系统的运营

北京木奇移动技术有限公司

区块链技术 软件外包公司 RWA系统开发

Gitea Enterprise 23.8.0 发布 - 本地部署的企业级 Git 服务

sysin

Gitea

从0到1带你搞定“微信广告转化归因”

Chris Zhang

归因分析 微信广告 广告归因

CodeBuddy编程神器上线!分享测评100%领福利,开发者专享通道

CodeBuddy

人工智能 编程

稳居第一!博睿数据持续领跑中国APMO应用性能监控与可观测性市场!

博睿数据

云MES系统源码,支持 SaaS 多租户,支持二次开发

万界星空科技

开源 mes 开源mes mes源码 万界星空科技mes

Q1收入猛增46%,AI出海致富的秘密,藏在昆仑万维财报里

脑极体

AI

通义灵码编程智能体,上线!

阿里巴巴云原生

通义灵码

深度解析用户意图,让设备真正听懂需求

HarmonyOS SDK

harmoyos

区块链RWA系统的上线

北京木奇移动技术有限公司

区块链技术 软件外包公司 RWA开发

Invicti v25.5.0 发布,新增功能简介

sysin

invicti

抖音视频列表API接口(附代码示例)

tbapi

抖音API 抖音视频列表接口 抖音视频接口

AI Agent工作流解析:软件测试开发领域的实践

测试人

人工智能

台达支持经济学人集团Economist Impact发布全球可持续AI报告

财见

Arthas mc(Memory Compiler/内存编译器 )

刘大猫

人工智能 监控 Arthas 监控工具 mc

斯曼森携手亚马逊云科技,使用 Amazon Nova 打造中文法律大模型

亚马逊云科技 (Amazon Web Services)

HarmonyOS运动开发:如何集成百度地图SDK、运动跟随与运动公里数记录

王二蛋和他的张大花

鸿蒙

通义灵码编程智能体,上线!

阿里云云效

阿里云 云原生 通义灵码

黑龙江等保测评最新消息如下

黑龙江陆陆信息测评部

《算法导论(第4版)》阅读笔记:p9-p9

codists

算法

区块链ETF系统的优化

北京木奇移动技术有限公司

区块链技术 软件外包公司 区块链ETF

AI智上 | 数智司库:某能源央企集团智慧司库建设领先实践

用友智能财务

信息化 用友 财务 数智化 司库

区块链ETF系统的功能分解

北京木奇移动技术有限公司

区块链技术 软件外包公司 区块链ETF

Java日志性能那些事_Java_丁雪丰_InfoQ精选文章