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

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

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

4、针对以上几点对系能的影响中的第4,5点,对日志配置文件做如下配置: 
   a、设置日志缓存,以及缓存大小

Java代码  
  1. log4j.appender.A3.BufferedIO=true
  2. #Buffer单位为字节,默认是8K,IO BLOCK大小默认也是8K
  3. log4j.appender.A3.BufferSize=8192

以上配置说明,当日志内容达到8k时,才会将日志输出到日志输出目的地。 
  
b、设置日志输出为异步方式

Java代码  
  1. <appender name="DRFOUT" class="org.apache.log4j.DailyRollingFileAppender">
  2. <param name="File" value="logs/brws.log" />
  3. <param name="Append" value="true" />
  4. <param name="DatePattern" value="yyyy_MM_dd'.'" />
  5. <layout class="org.apache.log4j.PatternLayout">
  6. <param name="ConversionPattern" value="%d [%t] %-5p %l %x - %m%n" />
  7. </layout>
  8. </appender>
  9. <appender name="ASYNCOUT" class="org.apache.log4j.AsyncAppender">
  10. <param name="BufferSize" value="512" />
  11. <appender-ref ref="DRFOUT" />
  12. </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,就可以游刃有余地处理这些日志信息了。

转载于:https://www.cnblogs.com/duanxz/archive/2013/01/16/2862595.html

log4j日志输出性能优化相关推荐

  1. log4j日志输出性能优化-缓存、异步

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

  2. Mybatis 的Log4j日志输出问题 - 以及有关日志的所有问题

    转载自   Mybatis 的Log4j日志输出问题 - 以及有关日志的所有问题 使用Mybatis的时候,有些时候能输出(主要是指sql,参数,结果)日志.有些时候就不能. 无法输出日志的时候,无论 ...

  3. Log4j日志输出详细

    日志论 在应用程序中输出日志有有三个目的: (1 )监视代码中变量的变化情况,把数据周期性地记录到文件中供其他应用进行统计分析工作. (2 )跟踪代码运行进轨迹,作为日后审计的依据. (3 )担当集成 ...

  4. log4j日志输出框架

    什么是log4j框架呢? log4j是一个日志输出框架,用于输出日志的.比如MyBatis的日志就是通过log4j输出的,主流框架都是log4j输出的,Spring框架 也可以通过log4j输出日志! ...

  5. Log4j 日志输出学习(Eclipse)

    学习网址1:http://www.cnblogs.com/licheng/archive/2008/08/23/1274566.html 一.快速入手 1.官网下载log4j压缩包,本地加压 2.Ec ...

  6. log4j日志输出到web项目指定文件夹

    尝试将log4j的文件日志输出到web工程制定目录,遇到了很多问题,最终搞定,下面是记录. 其原理在于log4j的配置文件支持服务器的vm的环境变量,如${oss.log4j.path},在log4j ...

  7. java:log4j日志输出

    获取CLASSPATH下的配置文件.(src下,Build Path下) ResourceBundle rb = ResourceBundle.getBundle("service" ...

  8. 【MySQL】日志与性能优化

    是什么? 是最流行的关系型数据库管理系统 关系数据库是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据 mysql的优点: 1.性能卓越服务稳定,很少出现异常宕机 2. ...

  9. ELK Stack 日志平台性能优化实践

    性能分析 服务器硬件Linux:1cpu4GRAM 假设每条日志250Byte. 分析: ①logstash-Linux:1cpu 4GRAM 每秒500条日志: 去掉ruby每秒660条日志: 去掉 ...

最新文章

  1. 你还在费力的从零搭建项目吗?
  2. oracle 序列号同步,关于序列同步的问题
  3. php开源 饭馆记账软件_GitHub - CNYoki/xxjzWeb: 小歆记账WebApp项目(Web服务端)
  4. Exchange server 2003迁移到2010后,手动更新地址列表,提示OAB Versions无效
  5. HashMap之tableSizeFor
  6. The requested URL was not found on the server
  7. 如何在scoped不污染组件样式的前提下,实现el-input组件样式覆盖?
  8. div隐藏select显示的解决办法(就死select挡住了div) 不是网上找到的那五种
  9. java 取对象的类_Java中通过Class类获取Class对象的方法详解
  10. 电脑重装系统Win11时间同步失败怎么办
  11. 海康SDK数据类型转java
  12. Z-TEK CE usb转串口驱动(win32)
  13. 图像/视频无损放大,用一个工具就够了
  14. Redis学习之hget命令
  15. 银行招考计算机专业考什么,银行笔试一般都考什么?
  16. 健康饮食--抗氧化与肠道调节
  17. 关于正确处理0x80070426等错误的方法
  18. 如何保证路缘石滑模机作业质量的几个原则
  19. mysql%3e= %3c=某个时间_乐视网某站SQL注入3枚
  20. 四则运算——结对项目报告

热门文章

  1. 编程语言对比 函数定义
  2. C++语言函数重载详解和示例
  3. redis mysql 集群_Redis(五)、Redis数据库集群相关
  4. 鸿蒙生态与苹果生态有什么区别,华为想用鸿蒙统一生态,苹果直接用芯片大一统,走到华为前面?...
  5. Veeam ONE v10.0.2.1094 安装教程+许可证
  6. vSAN其实很简单-什么!vSAN主机启动慢?
  7. Spring Cloud与微服务学习总结(1)——Spring Cloud及微服务入门
  8. PHP学习总结(10)——PHP入门篇之自定义网站根目录
  9. 制度化规范化标准化精细化_管理技巧:为什么说企业制度化管理势在必行?好处太多了...
  10. 怎么把线稿提取出来_PS教程:提取线稿如此简单?三种方法总有一种适合你