log4j日志输出性能优化-缓存、异步
- log4j.appender.A3.BufferedIO=true
- #Buffer单位为字节,默认是8K,IO BLOCK大小默认也是8K
- log4j.appender.A3.BufferSize=8192
以上配置说明,当日志内容达到8k时,才会将日志输出到日志输出目的地。
- <appender name="DRFOUT"...
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);
}