log 4 jパフォーマンスのチューニング


少し前にシステムの中で监视の机能を完成して、监视システムの情报の量はとても大きくて、ユーザーはページのすべてのクリックに対してすべて记录を生んで、毎日下りてくるログの量は2 G余りあって、私はlog 4 jでこれらの监视の记录をログの中に置いて、それから非同期の処理を行って、しかしこのようにして、记录のログはディスクIOに対して频繁なアクセスを生んで、IOは通常システムのボトルネックである.そこでlog 4 j構成をいくつかチューニングする必要がある.次に、私のシステムのlog 4 j構成を示します.
 
log4j.rootLogger=ERROR,fileout,stdoutlog4j.logger.monitorLogger=INFO,monitorAppenderlog4j.additivity.monitorLogger=false
log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d (%F:%L) %-5p %c - %m%n
log4j.appender.fileout=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.fileout.File=logs/server_log.txtlog4j.appender.fileout.layout=org.apache.log4j.PatternLayoutlog4j.appender.fileout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c - %m%n
log4j.appender.monitorAppender=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.monitorAppender.File=mtlogs/mt_log.txtlog4j.appender.monitorAppender.layout=org.apache.log4j.PatternLayoutlog4j.appender.monitorAppender.layout.ConversionPattern=%m%nlog4j.appender.monitorAppender.DatePattern='.'yyyy-MM-dd-HHlog4j.appender.monitorAppender.BufferedIO=true#Bufferの単位はバイトで、デフォルトは8 Klog 4 jである.appender.monitorAppender.BufferSize=8192
 
1)log4j.additivity.monitorLogger=falseこのオプションは、監視loggerのログがrootloggerに出力されないことを制御するために使用されます.そうしないと、多くの重複データが発生し、パフォーマンスにも影響します.
 
2)log4j.appender.monitorAppender.DatePattern='.'yyyy-MM-dd-HHこのオプションは、デフォルトの1日1回ではなく、DailyRollingFileAppenderに1時間に1回ログを出力するように伝えます.監視ログのデータ量が大きいため、日単位で出力するとログファイルが大きく(Gレベル)、再処理に時間がかかります.その他の出力オプションは、1)'.'です.yyyy-MM:毎月2)'.'yyyy-ww:毎週3)'.'yyyy-MM-dd:毎日4)'.'yyyy-MM-dd-a:1日2回5)'.'yyyy-MM-dd-HH:毎時6)'.'yyyy-MM-dd-H-mm:毎分
 
3)log4j.appender.monitorAppender.BufferedIO=truelog4j.appender.monitorAppender.BufferSize=8192このオプションは、log 4 jがログを出力するときにインスタントflush方式ではなくバッファ方式を採用することをlog 4 jに伝え、バッファを8 Kに設定し、8 Kがデフォルト値であり、ログ出力の状況に応じて変更することができる.このオプションは重要です.テストでは、1秒あたり100個以上の同時アクセスが高い場合、キャッシュの使用とバッファの使用の差が大きいことがわかりました.具体的な数字はここでは列挙しません.また、log 4 j出力バッファログは8 K単位です.ディスクのblockが8 Kなので、破片を減らすことができます.つまり、キャッシュを18 Kに設定すると、log 4 jは18 K(8 K*2)ではなく16 K(8 K*2)で出力されます.
 
4)出力コンテンツを組み立てる前にloggerの出力レベルをlog 4 j制御に完全に依存せずに判断することができる.出力ログコンテンツを組み立てるのも効率を損なうからである.
 
 // 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){

}