`

日志优化

    博客分类:
  • JAVA
 
阅读更多

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

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


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

 

文章出处:http://www.infoq.com/cn/articles/things-of-java-log-performance

分享到:
评论

相关推荐

    Unity3D 日志优化 写入本地性能优化

    Unity3D 日志优化 使用参考 Unity3D 日志优化 使用参考 Unity3D 日志优化 使用参考 https://blog.csdn.net/nicepainkiller/article/details/84958804 ...

    Oracle数据库重做日志优化设计研究.pdf

    Oracle数据库重做日志优化设计研究.pdf

    IBM DB2数据库性能优化视频.rar

    │ │ 第5周 日志优化.mp4 │ └ 第5周 日志优化.pdf ├ 第06周 DB2运维工具优化 │ │ 第6周 DB2运维工具优化.mp4 │ └ 第6周 运维工具优化.pdf ├ 第07周 锁机制深入解析 │ │ 第7周 锁机制深入解析.mp4 │ └ ...

    IBM DB2经典视频教程

    第5周 DB2性能优化:日志优化,包括日志优化三原则、日志原理、参数配置、日志性能监控等。 第6周 DB2性能优化:运维工具优化,包括Runstats、Reorg、Export、Import、Load、Backup/Restore等。 第7周 DB2性能优化:...

    Apache 集群性能优化 日志切分

    简单明了的Apache 集群性能优化 日志切分

    MySQL的慢日志线上问题及优化方案

    MySQL 慢日志(slow log)是 MySQL DBA 及其他开发、运维人员需经常关注的一类信息。使用慢日志可找出执行时间较长或未走索引等 SQL 语句,为进行系统调优提供依据。 本文将结合一个线上案例,分析如何正确设置 ...

    题库系统源码.zip

    ·[系统优化] 支付中心回调日志优化完善 ·[系统优化] 系统集成时源代码编辑行距问题优化 ·[系统优化] 系统升级界面日志颜色优化 ·[系统优化] 路由请求定义优化 ·[系统优化] 用户VIP开通支付实现方式 ·...

    魔众题库系统 v7.6.0.zip

    ·[系统优化] 支付中心回调日志优化完善 ·[系统优化] 系统集成时源代码编辑行距问题优化 ·[系统优化] 系统升级界面日志颜色优化 ·[系统优化] 路由请求定义优化 ·[系统优化] 用户VIP开通支付实现方式 ·...

    AH物料仓管系统(ERP仓库管理软件) v4.10 免费版.zip

    AH物料仓管系统(ERP仓库管理软件)是一款专业的仓库管理软件。软件适用于各个行业的仓库管理,功能强大,能任意...优化软件界面, 优化物料需求构成, 增强局域网和互联网共享支持 AH物料仓管系统(ERP仓库管理软件)截图

    PHPYUN人才招聘系统V4.6Beta_VIP版更新包(20181211)百度网盘

    PHP云人才招聘系统 v4.6Beta-20181211 - 更新日志 优化:调整模板引擎标签机制,提升整体调用标签执行效率 优化:企业LOGO、二维码上传验证机制 优化:微信公众号接收参数验证 优化:由于微信公众号推送规则变更...

    MS SQL 2000 数据库批量收缩日志截断优化软件

    通过定期运行本软件收缩数据库和截断日志文件,对 MS SQL 2000 数据库进行优化,以保证 MS SQL 2000 数据库高效运转。 软件主要功能: ① 备份数据库到指定目录 ② 收缩数据库,减少数据库体积 ③ 截断日志文件,...

    MySQL优化篇:慢查询日志.pdf

    主要介绍MySQL数据库中慢查询日志的使用流程、使用方式、以及日志分析工具mysqldumpslow的相关内容

    美点桌面 v4.0.0.20151219.zip

    美点桌面简称“美点”,美点桌面是一款...美点桌面 v4.0.0.20151219更新日志 优化:图标伸缩过程的流畅度 优化:动态时钟出现重复重绘的细节 修正:动态时钟在某种特定情况下出现的标题不隐藏的Bug 美点桌面截图

    AH人事管理系统(HR软件) v4.11 免费版.zip

    AH人事管理软件秉承佐手AH系列软件新颖实用简便的特点,为您提供了一款适用于各企事业单位的通用人事管理软件HR人力资源管理软件系统,AH...优化员工表树状图, 优化软件界面,优化网络版支持等 AH人事管理软件截图

    FE内容付费系统响应式+带手机版 v5.17.zip

    FE内容付费系统响应式(带手机版) v5.17 更新日志 优化顶部手机版访问地址二维码生成速度 FE内容付费系统程序特点 1、功能完善: 网站各种SEO属性设置、留言评论、会员投稿、会员积分功能、管理员管理、数据库备份...

    AH企业办公管理系统 v4.11 免费版.zip

    AH办公管理软件秉承佐手AH系列软件新颖实用简便的特点,为您提供了一款适用于各企事业单位都适用的通用ERP/OA办公管理软件,AH办公管理软件是一款傻瓜型的...优化流程管理和网络共享等功能 AH企业办公管理系统软件截图

    基于Web日志挖掘的网站结构优化方法

    基于Web日志挖掘的网站结构优化方法

    OpenWBS v3.0 企业建站系统商业版.rar

    新核心,程序更加健壮安全可靠 保证系统安全可靠稳定的运行 OpenWBS建站系统特点:SEO专业优化 SEO专业优化 自定义页面URL地址/标题/关键词和描述 并可以设置内链关键词来强化内链优化 OpenWBS v3.0更新日志 ...

    AH计算器软件 v4.13 免费版.zip

    佐手软件所提供的新型表达式语音计算器软件下载,AH计算器软件秉承佐手AH系列软件新颖实用简便的特点,为您提供了一款...AH计算器软件 v4.13 免费版 更新日志 优化软件界面,增强帮助信息和语音支持 AH计算器软件截图

Global site tag (gtag.js) - Google Analytics