`
qianhao_1987
  • 浏览: 20355 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

log4j日志输出性能优化

阅读更多
1、log4j已成为大型系统必不可少的一部分,log4j可以很方便的帮助我们在程序的任何位置输出所要打印的信息,便于我们对系统在调试阶段和正式运行阶段对问题分析和定位。由于日志级别的不同,对系统的性能影响也是有很大的差距,日志级别越高,性能越高。

2、log4j主要分为error,warn,info,debug四个级别,也是使用最多的四种,日志级别从左至右依次增加。

3、log4j对系统性能的影响程度主要体现在以下几方面:  
  a、日志输出的目的地,输出到控制台的速度比输出到文件系统的速度要慢。
   b、日志输出格式不一样对性能也会有影响,如简单输出布局(SimpleLayout)比格式化输出布局(PatternLayout)输出速度要快。可以根据需要尽量采用简单输出布局格式输出日志信息。
   c、日志级别越低输出的日志内容就越多,对系统系能影响很大。
   d、日志输出方式的不同,对系统系能也是有一定影响的,采用异步输出方式比同步输出方式性能要高。
   e、每次接收到日志输出事件就打印一条日志内容比当日志内容达到一定大小时打印系能要低。


4、针对以上几点对系能的影响中的第4,5点,对日志配置文件做如下配置:
   a、设置日志缓存,以及缓存大小
     
log4j.appender.A3.BufferedIO=true 
     #Buffer单位为字节,默认是8K,IO BLOCK大小默认也是8K  
     log4j.appender.A3.BufferSize=8192 
   
  以上配置说明,当日志内容达到8k时,才会将日志输出到日志输出目的地。
 
b、设置日志输出为异步方式
   <appender name="DRFOUT" class="org.apache.log4j.DailyRollingFileAppender">  
        <param name="File" value="logs/brws.log" />  
        <param name="Append" value="true" />  
        <param name="DatePattern" value="yyyy_MM_dd'.'" />  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="%d [%t] %-5p %l %x - %m%n" />  
        </layout>  
    </appender>  
  
    <appender name="ASYNCOUT" class="org.apache.log4j.AsyncAppender">  
        <param name="BufferSize" value="512" />  
      <appender-ref ref="DRFOUT" />  
    </appender>  


同步情况:各线程直接获得输出流进行输出(线程间不需要同步)。
异步情况:1.各线程将日志写到缓存,继续执行下面的任务(这里是异步的)
         
2.日志线程发现需要记日志时独占缓存(与此同时各线程等待,此时各线程是被阻塞住的),从缓存中取出日志信息,获得输出流进行输出,将缓存解锁(各线程收到提醒,可以接着写日志了)

   众所周知,磁盘IO操作、网络IO操作、JDBC操作等都是非常耗时的,日志输出的主要性能瓶颈也就是在写文件、写网络、写JDBC的时候。日志是肯定要记的,而要采用异步方式记,也就只有将这些耗时操作从主线程当中分离出去才真正的实现性能提升,也只有在线程间同步开销小于耗时操作时使用异步方式才真正有效 !

    现在我们接着分别来看看这几种记录日志的方式:

    a、将日志记录到本地文件 同样都是写本地文件Log4j本身有一个buffer处理入库,采用异步方式并不一定能提高性能(主要是如何配置好缓存大小);而线程间的同步开销则是非常大的!因此在使用本地文件记录日志时不建议使用异步方式。   
    b、将日志记录到JMS JMS本身是支持异步消息的,如果不考虑JMS消息创建的开销,也不建议使用异步方式。    
   c、将日子记录到SOCKET 将日志通过Socket发送,纯网络IO操作不需要反馈,因此也不会耗时 
    d、将日志记录到数据库 众所周知JDBC是几种方式中最耗时的:网络、磁盘、数据库事务,都使JDBC操作异常的耗时,在这里采用异步方式入库倒是一个不错的选择。   
   e、将日志记录到SMTP 同JDBC


5、异步输出日志工作原理
  
   AsyncAppender采用的是生产者消费者的模型进行异步地将Logging Event送到对应的Appender中。

a、 生产者:外部应用了Log4j的系统的实时线程,实时将Logging Event传送进AsyncAppender里

b、 中转:Buffer和DiscardSummary

c、 消费者:Dispatcher线程和appenders

工作原理:

1) Logging Event进入AsyncAppender,AsyncAppender会调用append方法,在append方法中会去把logging Event填入Buffer中,当消费能力不如生产能力时,AsyncAppender会把超出Buffer容量的Logging Event放到DiscardSummary中,作为消费速度一旦跟不上生成速度,中转buffer的溢出处理的一种方案。

2)  AsyncAppender有个线程类Dispatcher,它是一个简单的线程类,实现了Runnable接口。它是AsyncAppender的后台线程。

Dispatcher所要做的工作是:

① 锁定Buffer,让其他要对Buffer进行操作的线程阻塞。

② 看Buffer的容量是否满了,如果满了就将Buffer中的Logging Event全部取出,并清空Buffer和DiscardSummary;如果没满则等待Buffer填满Logging Event,然后notify Disaptcher线程。

③ 将取出的所有Logging Event交给对应appender进行后面的日志信息推送。

以上是AsyncAppender类的两个关键点:append方法和Dispatcher类,通过这两个关键点实现了异步推送日志信息的功能,这样如果大量的Logging Event进入AsyncAppender,就可以游刃有余地处理这些日志信息了。

分享到:
评论
2 楼 blackleaf 2013-02-07  
Dispatcher描述的第二点好像有点问题,应该不等buffer满就会输出到下级appender了
1 楼 dearhwj 2012-11-04  
整理的很不错!  http://www.daniel-journey.com/archives/923

相关推荐

    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 -...

    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 框架...

    lw_reptile:图片爬虫-

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

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

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

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

    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. 客户端脚本和实用工具...

    ibatis 开发指南(pdf)

    ibatis 采用Apache common_logging,并结合Apache log4j 作为日志输出组件。在 CLASSPATH 中新建log4j.properties 配置文件,内容如下: log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org....

    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. 客户端脚本和实用...

    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. 客户端脚本和实用...

    MySQL5.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. 客户端脚本和实用工具...

    Toad 使用快速入门

    从网络到性能优化,从备份恢复到Error message,一应俱全 例子:遇到失效的存储过程怎么办? 4. 如何对存储过程进行Debug?  需要Toad单独的Debug Option(Standard Version 没有这个选项)  要用Toad对存储...

    mysql5.1中文手册

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

    网管教程 从入门到精通软件篇.txt

    设备名称可从 map 命令的输出获得。例如,设备名称:  DeviceHardDisk0  drive_name  以驱动器号表示的待删除分区。仅与 /delete 同时使用。以下是驱动器名称的范例:  D:  partition_name  以分区名称...

    新版Android开发教程.rar

    四频 (850 , 900 , 1800 , 1900) ;支持 3G , 802.11b 和 802.11g 。----------------------------------- Android 编程基础 5 互联网 支持 HTTP 、 WAP Push 和 xHTML ;支持 POP 、 IMAP 、 SMTP ,以及 AOL ...

Global site tag (gtag.js) - Google Analytics