`
qianhao_1987
  • 浏览: 21174 次
  • 性别: 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

相关推荐

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

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

    log4j按功能保存日志

    - **Logger**: 日志记录器,是Log4j的核心组件,负责实际的日志输出。你可以为每个功能模块创建一个独立的Logger,以便区分日志来源。 - **Appender**: 输出目的地,用于定义日志信息被发送到哪里,如控制台、文件...

    打log4j日志-ibatis的sql输出

    Log4j的配置文件通常是`log4j.properties`或`log4j.xml`,在这里你可以设置不同级别的日志输出,例如DEBUG、INFO、WARN、ERROR等。 对于Ibatis,这是一个轻量级的持久层框架,它将SQL语句与Java代码分离,提供了...

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

    这是log4j框架的配置文件,使用Java Properties格式,用于定义日志输出的行为。主要包括以下几个核心部分: 1. **Logger**: 定义日志级别,例如DEBUG、INFO、WARN、ERROR和FATAL。日志级别决定了哪些信息会被记录。...

    log4j 日志输出

    在软件开发中,日志输出是不可或缺的一部分,它可以帮助开发者追踪程序运行状态,定位错误,进行性能分析,以及优化系统。Log4j,作为Apache的一个开源项目,是Java平台上的一个强大的日志框架,提供了灵活的日志...

    Log4j分包输出日志

    实现分包日志输出的关键在于配置文件(通常是log4j.properties或log4j.xml)。在配置文件中,我们可以定义多个Logger,并通过设置它们的name属性为类的包名来关联不同的日志输出策略。以下是一个简单的配置示例: `...

    log4j日志jar包.rar

    在上述配置中,我们设置了两个Appender,一个将日志输出到控制台,另一个将日志写入到指定文件,并且只记录DEBUG及以上的日志级别。 **使用Log4j** 在Java代码中,通过以下方式创建和使用Logger: ```java import...

    log4j日志包日志包

    通过`log4j.properties`或`log4j.xml`配置文件,可以定制日志输出的级别、目的地和格式,从而满足不同项目的需求。在实际开发中,正确地使用和配置`log4j`能显著提升问题排查和系统监控的效率。

    log4J日志.zip

    在“log4j日志.zip”压缩包中,包含的可能是Log4j的配置文件(如log4j.properties或log4j.xml)。这个文件定义了日志的级别、输出位置和格式。例如: ```properties # log4j.properties 示例 log4j.rootLogger=...

    log4j日志jar包

    《深入理解Log4j日志框架》 在Java开发领域,日志系统是不可或缺的工具,它用于记录程序运行过程中的各种信息,帮助开发者在问题出现时定位和解决问题。Log4j作为Apache软件基金会的一个开源项目,是Java世界中最...

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

    1. 配置文件(如log4j2.xml或log4j2.json):定义了Log4j2的日志配置,包括日志级别、输出目的地、是否启用异步模式等。 2. 测试类(如Log4j2AsyncTest.java):包含了测试用例,用于对比Log4j2异步和同步日志的性能...

    示范如何在android工程中使用log4j记录日志

    2. **配置Log4j**:在Android项目中,通常将Log4j的配置写入一个XML文件,如log4j2.xml,然后将其放在res/xml目录下。以下是一个基本配置示例: ```xml [%t] %-5level %logger{36} - %msg%n"/&gt; ...

    log4j输出日志到数据库表中

    2. **Log4j配置**:要将日志输出到数据库,需要在`log4j.properties`或`log4j.xml`配置文件中添加一个Appender,指定为JDBC类型。配置包括数据库连接信息(如URL、用户名、密码)、SQL语句(插入日志记录)等。 3. ...

    tomcat8更换log4j记录日志

    例如,若要将日志输出到名为"tomcat.log"的文件,并设置日志级别为INFO,"log4j.properties"文件可能包含以下内容: ``` log4j.rootLogger=INFO, FILE log4j.appender.FILE=org.apache.log4j.FileAppender log4j....

    log4j-控制指定类,包的日志级别:log4j-demo.zip

    通过灵活调整日志级别,开发者可以方便地获取所需的信息,同时避免过多的日志输出影响系统性能。在实际项目中,合理设置日志级别对于维护良好的系统运行环境至关重要。在`log4j-demo`压缩包中,你可以找到一个实际...

    AndroidStudio 使用log4j记录日志,按照大小定期滚动日志Demo

    这段代码设置了日志输出到控制台和文件,文件名为"app.log",并按文件大小1MB进行滚动,最多保留5个旧文件。 3. **使用log4android记录日志** 现在可以在代码中使用log4android记录日志了: ```java private ...

    log4net日志输出

    `log4net`允许将日志输出到不同的目的地,如控制台、文件、电子邮件、数据库等。每种目标都有相应的appender,如`ConsoleAppender`、`FileAppender`、`SmtpAppender`等。布局(layout)则决定了日志的格式,如`...

    一种基于Log4J的日志输出组件的设计

    - **应用**:Log4J广泛应用于Java应用程序中,用于记录程序运行时的重要信息,以便于后续的问题定位、性能优化及审计等目的。 #### 3. 日志输出组件的设计思路 - **背景**:本文介绍的LogUtil组件是针对一款中型...

    log4j日志打印demo

    **正文** 日志系统在软件开发中扮演着至关重要的角色,它可以帮助开发者追踪程序...在"log4j日志打印demo"中,你将学习到如何设置Log4j以实现控制台和SD卡(针对Android)的日志输出,从而在实际开发中更加得心应手。

    log4j日志框架

    通过以上介绍,我们可以看出Log4j日志框架在Java开发中的重要地位,它不仅简化了日志处理,还为故障排查、性能分析和系统监控提供了有力支持。正确使用和配置Log4j,将有助于提升软件质量和维护效率。

Global site tag (gtag.js) - Google Analytics