`
沉沦的快乐
  • 浏览: 55630 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

log4j日志性能优化

    博客分类:
  • Java
阅读更多

       在软件系统中,打日志几乎是每个系统都会使用的行为不管是用来记录系统健康状态辅助问题定位,还是收集数据,以便后续数据分析等,日志都起着举足轻重的作用。但是IO的阻塞行为和磁盘读写速度低下意味着写日志并非是没有代价的。

 

存在问题

          在很多系统中,日志模块用的都是log4j,打日志用的都是同步方法,基本配置如下:

 

<appender name="appAppender" class="org.apache.log4j.DailyRollingFileAppender"> 
        <!-- <param name="Threshold" value="INFO" /> --> 
        <param name="File" value="/data/applogs/XXXXXXXX/logs/app.log"/> 
        <layout class="org.apache.log4j.PatternLayout"> 
            <param name="ConversionPattern" 
                   value="[hotel-order-service]%d [%t] %-5p [%X{HOTEL_LOG_TRACE_ID                          }] [%c %L] %m%n"/> 
        </layout> 
</appender>

 

  按照这种配置,日志的输出行为是,在代码层每次调用输出日志接口的时候,这条日志就马上写入到磁盘中,java的io是阻塞的,而当前磁盘的写性能低下是共知的。我随机找了公司几台服务器用iostat命令查看了每次写磁盘的时间,发现每次io最快也要1.5ms,慢的需要5.7ms!如果某个接口平均需要打5条日志,那么花在打日志上的时间平均就需要10ms。为了减少打日志的时间,最主要的是减少往磁盘写日志的次数,但是如果不能从代码层减少写日志的次数,那么考虑从系统上减少往磁盘写日志的次数。

 

 

优化方法&测试 

     log4j的DailyRollingFileAppender的实现了缓存模式,即合并日志输出的模式,它先把所有的日志都放到一个buffer数组里,如果buffer满了,就把buffer里内容全部写入磁盘,这样可以大大减少调用磁盘的次数。buffer的大小默认是8K(不同的版本默认值可能不一样)。举个例子, 比如你每次要输出1K的日志,那么你输出8次,才会调用1次磁盘io。为了开启合并日志的方式,需要在配置把bufferedIO设置为true,同时也可以根据系统实际情况设置bufferSize来改变buffer数组的大小。 

      为了验证缓存模式的性能,在某系统中,尝试开启了缓存模式,同时把buffersize设置为50K。下面的配置是开启log4j的缓存:

<appender name="appAppender" class="org.apache.log4j.DailyRollingFileAppender"> 
        <param name="bufferedIO" value="true" />    
         <!-- 50k为一个写单元 ,可以自己定义--> 
        <param name="bufferSize" value="51200" />
        <param name="File" value="/data/applogs/XXXXXXXX/logs/app.log"/> 
        <layout class="org.apache.log4j.PatternLayout"> 
            <param name="ConversionPattern" 
                   value="[hotel-order-service]%d [%t] %-5p [%X{HOTEL_LOG_TRACE_ID}] [%c %L] %m%n"/> 
        </layout> 
</appender>

 

 

          下面是开启缓存模式前后的响应时间测试: 

       首先,需要保证服务器环境的一致性,因为不同的服务以及服务器再不同的qps压力下,响应时间也会不同。因此整个的测试数据收集时间再2个小时以内,从公司内部监控系统来看,测试前后的qps基本一致,保证了测试数据的可靠性。然后对比系统响应时间。系统主要的几个接口响应时间基本降低了10-20ms,同时系统的整体平均响应时间降低了4%说明了开启缓存模式确实有助于减少系统的响应时间,提升系统的性能。

 

优化日志完整性

       那么问题来了:既然开启缓存模式能提高系统,那么log4j为什么没有默认开启缓存模式呢?个人猜测是因为缓存模式需要缓存填充满了才会写入磁盘,但是假如系统突然崩溃了,缓存中残留的数据没有写入磁盘,从而导致日志丢失。而系统崩溃时的日志往往是排查和定位问题的关键,所以大部分情况下日志的完整性更为重要。但是享受缓慢模式的高性能与日志的完整性真的是鱼与熊掌不可兼得吗?log4j的DailyRollingFileAppender确实不可兼得,但是可以自己扩展DailyRollingFileAppender类。使用jvm钩子,在jvm退出前,先把缓存里的日志写到磁盘上。下面是自己扩展的ExtendDailyRollingFileAppender。 

 

public class ExtendDailyRollingFileAppender extends DailyRollingFileAppender{ 
public ExtendDailyRollingFileAppender() {   
        super();   
        Runtime.getRuntime().addShutdownHook(new Log4jHockThread());   
    } 
public ExtendDailyRollingFileAppender(Layout layout, String filename,   
            String datePattern) throws IOException {   
        super(layout, filename, datePattern);   
        Runtime.getRuntime().addShutdownHook(new Log4jHockThread());   
    } 
public QuietWriter getQw() {   
        return super.qw;   
    }  
private class Log4jHockThread extends Thread {   
       @Override   
       public void run() {   
           QuietWriter qw = ExtendDailyRollingFileAppender.this.getQw();   
           if (qw != null) {   
               qw.flush();   
           }   
       }   
   } 
} 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Java日志体系全解析:架构师必掌握的关键技术和最佳实践

    最初,log4j作为早期流行的日志框架,广泛应用于Java项目中。然而,随着Java平台的发展,出现了多种日志框架,如JUL(java.util.logging)和JCL(Jakarta Commons Logging),这增加了选择和维护的复杂性。JCL作为一...

    log4Net详解(共2讲)

    4、项目实战篇: Extjs3.2+ASP.NET七层架构+设计模式+ log4j+WebSerice等技术国讯教育通用智能OA办公平台 适用对象 1、要求有一定的javascript语言和HTML,CSS基础的学员 2、有一定的Asp.net网页编程基础和C#语言...

    Tomcat\Tomcat优化和监控

    log4j.propertis文件中是否设置成ERROR级别 2、把tomcat安装为windows服务的时候,要把jvm内存设置成1G,同时一定要把这些参数加进去。 -XX:PermSize=64M -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=48m -...

    Tomcat优化和监控.docx

    log4j.propertis文件中是否设置成ERROR级别 2、把tomcat安装为windows服务的时候,要把jvm内存设置成1G,同时一定要把这些参数加进去。 -XX:PermSize=64M -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=48m -...

    ES集群性能优化及维护B

    方式一:修改日志配置文件(config/log4j2.properties) appender.rolling.strategy.action.condition.nested_condition.type = IfAccumulatedFileSize appender.rolling.strategy.action.condition.nested_condition....

    iBase4J分布式系统-其他

    9、日志:log4j2打印日志,业务日志和调试日志分开打印。同时基于时间和文件大小分割日志文件。10、QQ、微信、新浪微博第三方登录。11、工具类:excel导入导出,汉字转拼音,身份证号码验证,数字转大写人民币,FTP/...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    log4j logback commong logging jdk logger 测试框架 测试框架 junit easymock testng mockito bug管理 禅道 jira 开发工具 编程工具 eclipse myeclipse idea vi VS webstorm sublime text ...

    SpringBoot新手学习手册

    6.1使用log4j记录日志 30 6.2使用AOP统一处理Web请求日志 32 6.3Spring Boot集成lombok让代码更简洁 33 七、 缓存支持 35 7.1注解配置与EhCache使用 35 7.2使用Redis集成缓存 37 八、 热部署 37 8.1 什么是热...

    lw_reptile:图片爬虫-

    lw_reptile 只需只提供代码部分,打包好的可运行程序见 #运行方式(两种)1.... 8.log4j日志拦截并输出到界面,以及日志文件记录。 9.多线程高并发以及线程池定时任务实现。 10.线程安全以及高速高性能优化。

    hadoop配置文件——精简版.zip

    此压缩包主要包含的是是hadoop的7个主要的配置文件,core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、hadoop-env.sh、mapred-env.sh、yarn-env.sh精简配置...以及两个log4j.properties日志配置文件。

    Java全套知识体系

    文章目录一、Java基础1.1 多线程1.2 内存优化1.3 日志输出log4j21.4 lombok二、Java框架2.1 Spring2.1.1 IOC\AOP2.1.2 事务2.2 SpringMVC2.2.1 六大组件介绍和分析2.2.2 策略模式适配器模式2.3 MyBatis2.3.1 框架...

    基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.0.0版_EXE)

    15、新增log4j2,TableGo的运行日志将在logs目录中输出,方便查找问题。 16、公共参数移除两个扩展参数配置,生成JavaBean功能移除用户模板配置。 17、新增TableGo官网:http://www.tablego.cn 18、新增数据信息...

    基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.0.0版_JAR)

    15、新增log4j2,TableGo的运行日志将在logs目录中输出,方便查找问题。 16、公共参数移除两个扩展参数配置,生成JavaBean功能移除用户模板配置。 17、新增TableGo官网:http://www.tablego.cn 18、新增数据信息...

    数据库工具TableGo_preview_20190212.rar

     15、新增log4j2,TableGo的运行日志将在logs目录中输出,方便查找问题。  16、公共参数移除两个扩展参数配置,生成JavaBean功能移除用户模板配置。  18、新增数据信息界面,定时从官网更新数据,捐赠名单也自动...

    MySQL 5.1参考手册

    7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用内存 7.5.6. MySQL如何使用DNS 7.6. 磁盘事宜 7.6.1. 使用符号链接 8. 客户端和实用工具程序 8.1. 客户端脚本和实用工具...

    扒站java源码-zrp:zrp是使用Java开发的一款基于Netty的内网穿透工具,主要用于将内网服务反向代理到公网访问。目前支持所有TCP

    船新版本正在开发中,自测体验比上一版丝滑,在设计上进行了一些优化,技术上新增了Redis、Log4j2,也可能会加上其它技术,按需求和兴趣来上。新版本改进如下: 代码结构拆分,模块化开发,前后端分离更彻底。 优化...

    ibatis 开发指南(pdf)

    在 CLASSPATH 中新建log4j.properties 配置文件,内容如下: log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log...

    MySQL 5.1参考手册 (中文版)

    7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用内存 7.5.6. MySQL如何使用DNS 7.6. 磁盘事宜 7.6.1. 使用符号链接 8. 客户端和实用工具程序 8.1. 客户端脚本和实用工具...

    mysql官方中文参考手册

    7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用内存 7.5.6. MySQL如何使用DNS 7.6. 磁盘事宜 7.6.1. 使用符号链接 8. 客户端和实用工具程序 8.1. 客户端脚本和实用工具...

    MYSQL中文手册

    7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用内存 7.5.6. MySQL如何使用DNS 7.6. 磁盘事宜 7.6.1. 使用符号链接 8. 客户端和实用工具程序 8.1. 客户端脚本和实用...

Global site tag (gtag.js) - Google Analytics