不久前在系统中完成了监控的功能,监控系统的信息量很大,用户对页面的每一个点击都会产生记录,每天下来的日志量有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){
}
分享到:
相关推荐
为了提高性能,log4j-1.2.17引入了异步日志记录,通过使用`AsyncAppender`,可以在不影响主线程性能的情况下,将日志输出任务放到后台处理。此外,合理配置日志级别,避免不必要的日志输出,也能显著提升系统效率。 ...
它支持多种输出格式,可以方便地进行日志级别调整,有利于排查问题和性能调优。 **详细知识点:** 1. **日志框架**:Log4j是Java平台上的日志框架,它允许程序员以灵活的方式记录应用程序中的事件。这些记录可以是...
6. **日志和错误处理**:优化日志输出,避免在生产环境中输出详细的调试信息,使用异步日志处理,如Logback或Log4j,可以减少I/O阻塞,提高系统性能。 7. **类加载器优化**:理解Tomcat的类加载机制,避免类加载...
- **阅读源码**:通过阅读和理解测试源码,可以深入掌握Log4j2的工作原理和性能调优技巧。 - **动手实践**:自己编写测试用例,模拟不同的日志场景,对比不同配置下的性能差异。 通过这份"Log4j2效率测试源码",...
- **性能优化**:给出针对Log4j的性能调优建议,包括减少日志开销的方法、高效Appender的选择策略等。 - **异常处理**:讲解如何利用Log4j记录异常堆栈跟踪信息,以及如何处理日志系统本身的异常情况。 #### 4. ...
在最新版本logging-log4j2-log4j-2.15.0-rc1中,针对性能优化和安全性做了多项改进。本文将深入探讨Log4j2的优化策略,以及如何利用此版本进行高效日志管理。 一、Log4j2核心概念 1. **配置灵活性**:Log4j2的配置...
- 日志级别:在`conf/log4j.xml`中,日志级别应调整为至少info级别,以适应性能测试和生产环境,避免debug级别的性能开销。 - `conf/server.xml`中的参数`<property name="processors">1</property>`和`...
还有日志查看和分析工具,如LogAnalyzer,可以方便地对大量日志数据进行搜索、过滤和统计分析,这对于问题排查和性能调优至关重要。 综上所述,Log4j作为Java日志处理的重要工具,不仅提供了灵活的日志记录和输出...
- **日志级别**: 在`conf/log4j.xml`中,将日志级别至少调整为info级别,避免使用默认的debug级别,尤其是在性能测试和生产环境中。 - **处理器相关参数**: - `processors`: 该参数根据CPU核心数设置,如4核可以...
【SSH2+Log4j+异常简单框架】是一种常见的Java Web开发框架组合,它整合了Struts2、Hibernate和Spring三大主流框架,并结合了Log4j日志系统,用于实现高效、灵活和可维护的项目架构。这个框架的集成使得开发者能够更...
此外,结合日志分析工具,Log4j 日志可以帮助监控系统状态,进行性能调优和故障排查。 5. **扩展与集成** 由于其灵活性和广泛支持,Log4j 可轻松集成到 J2EE、JINI、SNMP 等环境中。开发者还可以使用第三方插件,...
- **配置位置**:`conf/log4j.xml`文件。 - **建议设置**:将日志级别从默认的debug级别调整为info级别,避免生产环境中因日志输出过多而导致的性能问题。 **2. 线程池大小调整** - **配置位置**:`conf/server...
Durid支持SQL解析,可以统计SQL执行时间,有助于性能调优;同时,它还有连接有效性检查、慢查询日志等功能,提升了数据库访问的安全性和稳定性。 **数据库加密** 在现代应用程序中,数据安全至关重要。数据库加密...
Apache Log4j 2.0 是一个用于日志记录的开源框架,它是Log4j项目的最新版本,旨在提供更高效、更灵活的日志记录解决方案。Log4j 是Java开发环境中广泛使用的日志工具,它允许程序员以声明式的方式配置日志输出,便于...
13. **日志审计** - 通过Log4j,可以收集和分析日志数据,用于系统监控、性能调优和安全审计。 14. **性能优化** - 了解何时启用和关闭日志,以及正确配置日志级别,可以帮助优化应用程序性能,减少不必要的日志...
Log4jForAndroid保留了这些优点,并针对Android的特性进行了优化,如内存管理和性能调优。 二、Log4jForAndroid的核心特性 1. **多级别的日志记录**:Log4jForAndroid支持DEBUG、INFO、WARN、ERROR和FATAL等不同...
-- 在log4j.properties或相应的日志配置文件中 --> log4j.logger.org.apache.struts2=ERROR ``` 2. **关闭开发模式**:通过设置`struts.devMode`属性为`false`,可以关闭开发模式,避免每次请求都进行模板编译等...
4. **性能分析**:通过日志记录性能指标,可以辅助进行性能调优。 5. **分布式系统日志**:在分布式环境中,log4net可以与其他日志收集系统结合,集中管理日志数据。 总结来说,log4net1.2.11是一个强大的日志框架...
- **使用log4j**:合理配置日志级别和输出格式,减少日志产生的性能损耗。 #### 八、其他性能问题 **1. 线程死锁** - **预防措施**:遵循良好的编程习惯,如按照固定顺序获取锁,避免嵌套锁定等。 - **诊断工具**...