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

log4j性能调优(转)

阅读更多

  不久前在系统中完成了监控的功能,监控系统的信息量很大,用户对页面的每一个点击都会产生记录,每天下来的日志量有2G多,我用log4j把这些监控记录放在日志里,然后进行异步处理,但即使是这样,记录日志会对磁盘IO产生频繁的访问,而IO通常就是系统的瓶颈所在。于是对log4j配置进行一些调优就成了必要。下面是我系统中的log4j配置:

 

log4j.rootLogger=ERROR,fileout,stdout
log4j.logger.monitorLogger=INFO,monitorAppender
log4j.additivity.monitorLogger=false

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d (%F:%L) %-5p %c - %m%n

log4j.appender.fileout=org.apache.log4j.DailyRollingFileAppender
log4j.appender.fileout.File=logs/server_log.txt
log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
log4j.appender.fileout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c - %m%n

log4j.appender.monitorAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.monitorAppender.File=mtlogs/mt_log.txt
log4j.appender.monitorAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.monitorAppender.layout.ConversionPattern=%m%n
log4j.appender.monitorAppender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.monitorAppender.BufferedIO=true
#Buffer单位为字节,默认是8K
log4j.appender.monitorAppender.BufferSize=8192

 

1)log4j.additivity.monitorLogger=false
这个选项用于控制监控logger的日志不会输出到rootlogger,否则无论会产生许多重复的数据,同时也会影响性能;

 

2)log4j.appender.monitorAppender.DatePattern='.'yyyy-MM-dd-HH
这个选项用于告诉DailyRollingFileAppender每小时输出日志,而不是默认的一天输出一次,因为监控日志的数据量很巨大,如果以天为单位输出,日志文件会很大(G级),而且再处理会很耗时。
其他一些输出选项还有:
1)'.'yyyy-MM: 每月
2)'.'yyyy-ww: 每周
3)'.'yyyy-MM-dd: 每天
4)'.'yyyy-MM-dd-a: 每天两次
5)'.'yyyy-MM-dd-HH: 每小时
6)'.'yyyy-MM-dd-HH-mm: 每分钟

 

3)log4j.appender.monitorAppender.BufferedIO=true
log4j.appender.monitorAppender.BufferSize=8192
这个选项用于告诉log4j输出日志的时候采用缓冲的方式,而不是即时flush方式,并且设定了缓冲为8K,8K是默认值,可以根据日志输出的情况来修改。这个选项很重要,在测试中发现,当并发访问很高,例如每一秒100个并发以上,使用缓存跟不使用缓冲差距很大。具体数字我这里就不列出来了。
另外我想说的是,log4j输出缓冲日志是以8K为单位的,因为磁盘的一个block为8K,这样可以减少碎片,也就是说假设你设置缓存为18K,log4j在16K(8K*2)的时候就会输出),而不是18K。

 

4)组装输出内容之前可对logger的输出级别先进行判断而不要完全依赖log4j控制,因为组装输出日志内容也是要损耗效率的。

 

 //若log4j并未开启info级日志记录,直接返回
        if(!monitorLogger.isInfoEnabled()){
            return;
        }
        StringBuilder log = new StringBuilder();
        logSql.append(logPk+" ");
        ...

 

 

5)使用异步输出 org.apache.log4j.AsyncAppender,异步输出必须使用xml方式配置才能支持,我把上面properties形式的配置文件用xml表达一下:

<?xml version="1.0" encoding="UTF-8"?>
<log4j:configuration debug="true">

    <appender name="stdout"
        class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d (%F:%L) %-5p %c - %m%n" />
        </layout>
    </appender>

    <appender name="fileout"
        class="org.apache.log4j.DailyRollingFileAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] (%F:%L) %-5p %c - %m%n" />
        </layout>
        <param name="File"
            value="logs/server_log.txt" />
    </appender>

    <appender name="monitorAppender"
        class="org.apache.log4j.DailyRollingFileAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%m%n" />
        </layout>
        <param name="DatePattern" value="'.'yyyy-MM-dd-HH" />        
        <param name="File" value="mtlogs/mt_log.txt" />
        <param name="BufferedIO" value="true" />
        <!-- 8K为一个写单元 -->
        <param name="BufferSize" value="8192" />
    </appender>

    <appender name="async" class="org.apache.log4j.AsyncAppender">
        <appender-ref ref="monitorAppender"/>
    </appender>
    
    <root>
        <priority value="error" />
        <appender-ref ref="stdout" />
        <appender-ref ref="fileout" />
    </root>
    
    <category name="com.danga.MemCached">
        <priority value="error" />
        <appender-ref ref="fileout" />
    </category >
    
    <category name="com.opensymphony">
        <priority value="error" />
        <appender-ref ref="fileout" />
    </category >
    
    <category name="monitorLogger" additivity="false">
        <priority value="info" />
        <appender-ref ref="async" />
    </category >
</log4j:configuration>

 配置中红色的部分就是用于支持异步输出的,在用jmeter测试的过程中发觉使用异步方式,工作的不是很稳定。性能的提升也不显著。所以最后并没有采用。

 

 

InputStream in=null;
try {
	in = Log4jConfigLocator.class.getResourceAsStream(fileName);
	if(fileName.endsWith(".xml")){
		//载入XML格式的配置文件
		Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in);
		DOMConfigurator.configure(doc.getDocumentElement());
	}else{
		//载入properties格式的配置文件
		Properties props = new Properties();
		props.load(in);
		PropertyConfigurator.configure(props);
	}
}
catch(Exception ex){

}

 

 

分享到:
评论
1 楼 gtandsn 2012-03-16  
[size=x-large][/size]31313

相关推荐

    log4j-1.2.17

    为了提高性能,log4j-1.2.17引入了异步日志记录,通过使用`AsyncAppender`,可以在不影响主线程性能的情况下,将日志输出任务放到后台处理。此外,合理配置日志级别,避免不必要的日志输出,也能显著提升系统效率。 ...

    log4j-1.2.14

    它支持多种输出格式,可以方便地进行日志级别调整,有利于排查问题和性能调优。 **详细知识点:** 1. **日志框架**:Log4j是Java平台上的日志框架,它允许程序员以灵活的方式记录应用程序中的事件。这些记录可以是...

    Tomcat性能调优

    6. **日志和错误处理**:优化日志输出,避免在生产环境中输出详细的调试信息,使用异步日志处理,如Logback或Log4j,可以减少I/O阻塞,提高系统性能。 7. **类加载器优化**:理解Tomcat的类加载机制,避免类加载...

    Log4j2效率测试源码

    - **阅读源码**:通过阅读和理解测试源码,可以深入掌握Log4j2的工作原理和性能调优技巧。 - **动手实践**:自己编写测试用例,模拟不同的日志场景,对比不同配置下的性能差异。 通过这份"Log4j2效率测试源码",...

    Pro Apache Log4j second edition

    - **性能优化**:给出针对Log4j的性能调优建议,包括减少日志开销的方法、高效Appender的选择策略等。 - **异常处理**:讲解如何利用Log4j记录异常堆栈跟踪信息,以及如何处理日志系统本身的异常情况。 #### 4. ...

    log4j优化文件 logging-log4j2-log4j-2.15.0-rc1.tar

    在最新版本logging-log4j2-log4j-2.15.0-rc1中,针对性能优化和安全性做了多项改进。本文将深入探讨Log4j2的优化策略,以及如何利用此版本进行高效日志管理。 一、Log4j2核心概念 1. **配置灵活性**:Log4j2的配置...

    Mycat性能调优指南.docx

    - 日志级别:在`conf/log4j.xml`中,日志级别应调整为至少info级别,以适应性能测试和生产环境,避免debug级别的性能开销。 - `conf/server.xml`中的参数`&lt;property name="processors"&gt;1&lt;/property&gt;`和`...

    log4j系统日志

    还有日志查看和分析工具,如LogAnalyzer,可以方便地对大量日志数据进行搜索、过滤和统计分析,这对于问题排查和性能调优至关重要。 综上所述,Log4j作为Java日志处理的重要工具,不仅提供了灵活的日志记录和输出...

    Mycat性能调优指南2

    - **日志级别**: 在`conf/log4j.xml`中,将日志级别至少调整为info级别,避免使用默认的debug级别,尤其是在性能测试和生产环境中。 - **处理器相关参数**: - `processors`: 该参数根据CPU核心数设置,如4核可以...

    ssh2+log4j+异常简单框架

    【SSH2+Log4j+异常简单框架】是一种常见的Java Web开发框架组合,它整合了Struts2、Hibernate和Spring三大主流框架,并结合了Log4j日志系统,用于实现高效、灵活和可维护的项目架构。这个框架的集成使得开发者能够更...

    log4j使用配置方法及项目中的应用

    此外,结合日志分析工具,Log4j 日志可以帮助监控系统状态,进行性能调优和故障排查。 5. **扩展与集成** 由于其灵活性和广泛支持,Log4j 可轻松集成到 J2EE、JINI、SNMP 等环境中。开发者还可以使用第三方插件,...

    Mycat性能调优指南1

    - **配置位置**:`conf/log4j.xml`文件。 - **建议设置**:将日志级别从默认的debug级别调整为info级别,避免生产环境中因日志输出过多而导致的性能问题。 **2. 线程池大小调整** - **配置位置**:`conf/server...

    ZK 前端框架 继承 SpringMVC +maven + log4j2 + slf4j + durid 数据库加密

    Durid支持SQL解析,可以统计SQL执行时间,有助于性能调优;同时,它还有连接有效性检查、慢查询日志等功能,提升了数据库访问的安全性和稳定性。 **数据库加密** 在现代应用程序中,数据安全至关重要。数据库加密...

    apache-log4j-2.0

    Apache Log4j 2.0 是一个用于日志记录的开源框架,它是Log4j项目的最新版本,旨在提供更高效、更灵活的日志记录解决方案。Log4j 是Java开发环境中广泛使用的日志工具,它允许程序员以声明式的方式配置日志输出,便于...

    Log4j

    13. **日志审计** - 通过Log4j,可以收集和分析日志数据,用于系统监控、性能调优和安全审计。 14. **性能优化** - 了解何时启用和关闭日志,以及正确配置日志级别,可以帮助优化应用程序性能,减少不必要的日志...

    Log4jForAndroid

    Log4jForAndroid保留了这些优点,并针对Android的特性进行了优化,如内存管理和性能调优。 二、Log4jForAndroid的核心特性 1. **多级别的日志记录**:Log4jForAndroid支持DEBUG、INFO、WARN、ERROR和FATAL等不同...

    struts2项目性能调优三步曲.txt

    -- 在log4j.properties或相应的日志配置文件中 --&gt; log4j.logger.org.apache.struts2=ERROR ``` 2. **关闭开发模式**:通过设置`struts.devMode`属性为`false`,可以关闭开发模式,避免每次请求都进行模板编译等...

    log4net1.2.11.dll 和 log4net1.2.11源码

    4. **性能分析**:通过日志记录性能指标,可以辅助进行性能调优。 5. **分布式系统日志**:在分布式环境中,log4net可以与其他日志收集系统结合,集中管理日志数据。 总结来说,log4net1.2.11是一个强大的日志框架...

    JAVA性能测试与调优案例

    - **使用log4j**:合理配置日志级别和输出格式,减少日志产生的性能损耗。 #### 八、其他性能问题 **1. 线程死锁** - **预防措施**:遵循良好的编程习惯,如按照固定顺序获取锁,避免嵌套锁定等。 - **诊断工具**...

Global site tag (gtag.js) - Google Analytics