`
raymond2006k
  • 浏览: 295561 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

log4j日志异步化大幅提升系统性能

    博客分类:
  • Log
阅读更多
经过大型J2EE项目实测,Log4j的日志输出对系统性能有比较显著的影响,尤其是日志输入量比较大时,例如:系统并发量很大,显示Hibernate的sql和参数日志,或日志级别较低DEBUG或INFO时等。
使用Async Logger控制日志输出可以显著改善系统性能。
 
 
1) 测试用例:同步文件日志输出
       测试功能:模块管理功能,
       输出Hibernate SQL和参数,输出到文件,配置如下:
       <appender name="Hibernate_SQL" class="org.apache.log4j.DailyRollingFileAppender">
              <param name="File" value="log/Hibernate_SQL.log" />
              <param name="Append" value="true" />
              <param name="DatePattern" value="'.'yyyy-MM-dd-HH" />
              <layout class="org.apache.log4j.PatternLayout">
                     <param name="ConversionPattern" value="%d [%-5p](%C,%L) - %m%n" />
              </layout>
       </appender>
      
       <category name="org.hibernate.SQL">
              <priority value="TRACE" />        
              <appender-ref ref="Hibernate_SQL" />
       </category>
       <category name="org.hibernate.type">
              <priority value="TRACE" />        
              <appender-ref ref="Hibernate_SQL" />
       </category>
       运用JMeter进行压力测试,线程数50,运行4次,计算请求平均响应值(Rame-up Period: 1, 循环次数:1)
 
测试结果:AVG: 12565ms
 
    2) 测试用例:异步文件日志输出
       Log4j.xml 配置修改如下:
    <appender name="ASYNC_Hibernate_SQL" class="org.apache.log4j.AsyncAppender">   
     <param name="BufferSize" value="512"/>   
     <appender-ref ref="Hibernate_SQL"/>
   </appender>
   
    <category name="org.hibernate.SQL">
        <priority value="TRACE" />     
        <appender-ref ref="ASYNC_Hibernate_SQL" />
    </category>
   
    <category name="org.hibernate.type">
        <priority value="TRACE" />     
        <appender-ref ref="ASYNC_Hibernate_SQL" />
    </category>
   
    在BufferSize为 32, 64,128,256,512,2048时测试的请求平均耗时,及较测试用例1中的性能提高率对比如下所示:
同步,异步日志性能对比分析
(每次50并发,运行4次)
 
sync 日志输出
原时间消耗
 
 
12565
 
async 日志输出
 
 
缓冲区大小
平均耗时
性能提高率
32
6744
46.33%
64
8487
32.46%
128
6899
45.09%
256
6606
47.43%
512
7306
41.85%
2048
3406
72.89%
 
    从结果可以看出,性能提高率最高 47%。最低32%。缓冲为256时性能改善最佳, 提高47%
   
结论:使用Log4j的J2EE应用,日志的优化对系统性能有显著影响:
     1)尽量减少不必要的日志输出,尤其要避免 root logger上过低级别的输出,避免在生产环境上向控制台输出日志。例如,下面的配置是很影响性能的,:
    <root>
        <priority value="DEBUG" /> 
        <appender-ref ref="CONSOLE" >  
    </root>
    2) 使用Async logger输出日志,buffersize在相应日志频率下,越大越好,对于大型项目,可以选2048以上值。
27
5
分享到:
评论
19 楼 Lee_Anson 2012-12-11  
两篇文章一模一样,楼主非原创http://blog.csdn.net/henryqqq/article/details/2254355
18 楼 littcai 2009-02-25  
我也是测试过的log4j-1.2.14.jar,JDK1.4.2+
上面给出的地址是因为网上现成的,log4j-1.2.14中这个报告已经没有了。
在java.io的源码,输出流在写的时候每次都是同步的。其实就是看具体写日志的那步操作耗时是否大于用异步+缓存的方式来存储日志
17 楼 raymond2006k 2009-02-19  
littcai 写道

http://www.ingrid.org/jajakarta/log4j/jakarta-log4j-1.1.3/docs/api/org/apache/log4j/performance/Logging.html

log4j本身的测试数据,Async并没有获得性能提升


本文是我经过实际测试的结果,基于 log4j 1.2.8.jar, jdk1.4.2+.
我注意到这个报告是  log4j1.1.3版本,jdk 1.3.

littcai 也可以自己实际测试一番。
16 楼 littcai 2009-01-14  
http://www.ingrid.org/jajakarta/log4j/jakarta-log4j-1.1.3/docs/api/org/apache/log4j/performance/Logging.html

log4j本身的测试数据,Async并没有获得性能提升
15 楼 jxb8901 2008-08-25  
上面回贴有误,刚才看了一下AsyncAppender的API,发现了一个getLocationInfo的方法,经测试是可以记录文件名和行号的。
14 楼 jxb8901 2008-08-25  
异步log无法记录异常发生的文件名和行号,因此其使用还是有很大限制
13 楼 szhnet 2008-08-24  
谢谢,学习了
12 楼 phz50 2008-08-22  
  写得很不错
11 楼 bohemia 2008-08-21  
使用DailyRollingAppender,确实有这个问题;
影响IO性能的主要有:
1.屏幕输出日志;
2.太多的Debug日志;


如果单纯降低日志级别到INFO或者ERROR,有时不可取; 因为毕竟很多日志是需要记录下来跟踪问题的;

LZ的方法,不错..原来本来想用SocketAppender来单独记录到独立的日志服务器的方式,避免本地的日志错误.以及多台服务器日志的同步的; 看来AsyncAppender也是不错提升日志性能的方法;


另外, DailyRollingAppender 这个日志记录器在Unix服务器有时候存在问题;
后来经网络查找有个修改过的补丁包,采用了 DailyRollingAppenderExt扩展了;避免了无法正常生成文件的情况;
10 楼 anchovy 2008-08-20  
DEBUG级别的时候可能性能提高明显,但实际运行时ERROR级别的时候似乎性能的影响不会很大。我在项目中会在开发和发布是用不同的配置
9 楼 raymond2006k 2008-08-20  
引用:
zhangbinghao
如果我要对网站的访问情况做日志,用LOG4J来记录一些信息。请问能满足这种应用吗?网站每天访问量在3亿PV,之前都是通过APACHE来记录,但是APACHE的日志格式过去单一,无法对一些特殊商业分析做深入分析。想通过LOG4J来记录,是否有这方面的应用呢?



我对apache server不太熟,首先你可以参考apache的文档,看日志格式能否设置为你们想要的格式。

log4j的输入完全就是自己做主啦。
例如:log.info("<saleRecord time=" + new Date() + " empNo=" + empNo + "... />");

将对应logger设置到文件输出,然后针对对应文件进行分析就可以了。
或者通过aync JDBCAppender向数据库输出也可以。
8 楼 raymond2006k 2008-08-20  
fight_bird 昨天 删除
已处于生产状态的系统本身就不应该有很多的log输出,只有当高负载的logger已经成为需求的一部分时这种调优才有意义。


同意 fight_bird 的,日志设为何种级别一般选warn或error为宜。

不过对于一些重要的大型系统, 通常需要将实参,sql参数,动态sql语句,结果记录条数等日志记录下来,以便在数据操作逻辑错误,例如:查询结果不符合预期等时,进行逻辑错误定位。
利用log4j,还能实现 访问记录进行安全审计等,都需要将对应logger的级别设为info或debug。
7 楼 zhangbinghao 2008-08-20  
如果我要对网站的访问情况做日志,用LOG4J来记录一些信息。请问能满足这种应用吗?网站每天访问量在3亿PV,之前都是通过APACHE来记录,但是APACHE的日志格式过去单一,无法对一些特殊商业分析做深入分析。想通过LOG4J来记录,是否有这方面的应用呢?
6 楼 sunfengcheng 2008-08-20  
很少接触 J2EE
5 楼 Unmi 2008-08-20  
还是不错,知道了有 AsyncAppender 这么一个东西
不过只是生产环境下,日志级别都设置为 ERROR,影响不大的
4 楼 fight_bird 2008-08-19  
已处于生产状态的系统本身就不应该有很多的log输出,只有当高负载的logger已经成为需求的一部分时这种调优才有意义。
3 楼 yefeng 2008-08-19  
不错,顶
2 楼 java菜菜鸟 2008-08-19  
原来还可以这样子,收藏起来.谢谢分享!
1 楼 onex 2008-08-19  
Async logger不错,谢楼主

相关推荐

    Log4j2异步写日志效率测试源码

    而Log4j2的一个显著特性是支持异步日志写入,这种模式可以显著提高系统的整体性能,特别是在高并发环境下。 本文主要探讨Log4j2异步写日志的效率,通过源码分析和测试来展示其优势。首先,我们要理解Log4j2中的异步...

    Log4j2异步写日志源码

    Log4j2是Apache提供的一款强大且灵活的日志框架,它的出现替代了早期的Log4j,提供了更高的性能和更丰富的功能。本文将深入探讨如何在Log4j2中实现异步写日志,并通过提供的文件`TestController.java`、`log4j2.xml`...

    log4j2异步多线程打印

    Log4j2引入了异步日志记录器,通过使用后台线程处理日志事件,从而避免了这种阻塞,极大地提升了应用的性能。 **多线程支持** 在多线程环境中,Log4j2能够确保日志事件的正确性和顺序。每个线程都有自己的日志上...

    使用log4j2实现日志数据脱敏

    Log4j2是Apache软件基金会开发的日志框架Log4j的升级版,它具有更高的性能、灵活性和可配置性。Log4j2支持多种日志记录级别(如DEBUG、INFO、WARN、ERROR),并允许通过XML、JSON、YAML或纯Java配置文件进行灵活配置...

    log4j日志配置以及配置文件详解

    **日志系统在软件开发中扮演着至关重要的角色,它能帮助开发者跟踪程序运行...同时,不断学习和探索log4j的高级特性,如异步日志、MDC(Mapped Diagnostic Context)等,可以进一步提升日志系统的实用性和可维护性。

    tomcat下的log4j日志配置

    在使用 Apache Tomcat 作为服务器时,合理配置日志框架(如 Log4j)能够极大地提高开发效率和系统的可维护性。本文将详细介绍两种常见的 Log4j 配置方式:Tomcat 级别的统一日志管理和每个 web 应用分别配置 Log4j,...

    使用Slf4j集成Log4j2构建项目日志系统的完美解决方案.docx

    使用Slf4j集成Log4j2构建项目日志系统的完美解决方案 Slf4j是简单的日志外观(Facade)模式,它提供了统一的日志接口,使得用户可以选择不同的日志实现。Slf4j的出现使得日志系统的开发变得更加灵活和便捷。Log4j2...

    log4j按功能保存日志

    Log4j是一款广泛使用的Java日志记录框架,它允许开发者按照功能模块或特定需求记录应用程序...通过正确配置,不仅可以方便地追踪和分析问题,还能优化系统性能,确保日志系统在不影响业务运行的前提下发挥最大效用。

    SSM整合中的Log4j日志的配置详情

    Log4j 的核心组件包括日志记录器(Logger)、日志输出目的地(Appender)和日志格式化器(Layout)。 二、配置 Log4j.properties 文件 在 SSM 整合项目中,配置 Log4j.properties 文件是必不可少的步骤。该文件...

    log4j日志jar包

    随着技术的发展,Log4j也经历了多次版本更新,其中Log4j 2.x引入了更多改进和新特性,如异步日志、插件体系等。值得注意的是,2021年Log4j 2.0至2.14.1版本出现了一个重大安全漏洞(CVE-2021-44228),导致远程代码...

    log4j日志报错解决办法

    总的来说,处理Log4j的初始化警告,关键在于正确配置和引入Log4j依赖,以及在需要使用日志的地方正确初始化logger。确保配置文件可用且路径正确,以及在代码中正确调用logger,通常可以消除这些警告。

    Log4j日志配置说明,Log4j日志配置说明

    ### Log4j日志配置详解 #### 一、概述 Log4j 是一个基于 Java 的开源日志记录框架,由 Apache 软件基金会维护。它允许开发人员根据等级记录日志信息,使得用户能够控制日志信息的记录级别及去向。本文将通过一份...

    log4j日志输出格式化和日志文件名格式化

    本文将深入探讨如何利用Log4j进行日志输出格式化以及设置日志文件名格式化,以满足公司的标准化需求。 首先,我们来看日志输出格式化。Log4j的核心在于其灵活性,可以通过自定义布局模板来控制日志输出的格式。最...

    log4j自定义日志文件名及日志输出格式

    Log4j是Apache提供的一款广泛使用的日志框架,它提供了丰富的配置选项,允许开发者灵活地控制日志输出。当我们面对特定项目需求,比如需要自定义日志文件名和日志输出格式时,Log4j同样提供了相应的解决方案。 首先...

    log4j 日志打印

    《深入理解Log4j日志打印》 在Java开发领域,日志打印是不可或缺的一环,它对于系统调试、性能监控、故障排查等都起着至关重要的作用。Log4j作为Java中最常用的日志框架之一,深受广大开发者喜爱。本文将深入探讨...

    log4j日志包日志包

    **日志系统在软件开发中的重要性** 日志系统是软件开发中不可或缺的一部分,它能够帮助开发者追踪程序运行状态,定位错误,优化性能,...在实际开发中,正确地使用和配置`log4j`能显著提升问题排查和系统监控的效率。

    log4J日志.zip

    **日志系统在软件开发中的重要性** ...正确配置和使用Log4j,不仅能够提高问题定位的效率,还有助于提升系统的整体运维水平。因此,理解并熟练掌握Log4j对于任何Java开发者来说都是必备技能之一。

    log4j日志jar包.rar

    **日志库Log4j详解** 日志在软件开发中起着至关...正确配置和使用Log4j能显著提高开发效率,同时也有助于提升系统的可维护性。这个资源包中的Log4j jar包以及相关的博文学习资料,将有助于你更好地理解和应用Log4j。

    log4j2 demo 性能测试

    相比传统的同步日志记录,Log4j2引入了异步日志记录模式,这一特性使得日志处理速度显著提升,尤其在高并发场景下,能够避免日志记录成为系统性能瓶颈。 Log4j2的核心组件包括配置器、日志事件、布局和Appender。...

    log4j 详解异步日志的配置和测试

    总之,Log4j 提供了灵活的日志配置选项,特别是异步日志记录,能有效提升系统性能。通过正确配置和测试,我们可以确保日志系统按照预期工作,为日常开发和运维提供有力支持。希望本文能帮助你更好地理解和应用 Log4j...

Global site tag (gtag.js) - Google Analytics