log 4 jログ出力性能最適化


1、log 4 jはすでに大規模なシステムの不可欠な一部となっており、log 4 jはプログラムの任意の位置で印刷する情報を出力するのに便利であり、システムのデバッグ段階と正式な運行段階で問題の分析と位置決めを容易にすることができる.ログ・レベルによってシステムのパフォーマンスに与える影響も大きく異なり、ログ・レベルが高いほどパフォーマンスが高くなります.
2、log 4 jは主にerror,warn,info,debugの4つのレベルに分けられ、最も多くの4つのレベルが使用され、ログレベルは左から右に順次増加している.
3、log 4 jがシステム性能に与える影響の程度は主に以下のいくつかの方面に現れている.
 
a、ログ出力の宛先、コンソールへの出力速度はファイルシステムへの出力速度より遅い.b、ログ出力フォーマットの違いは、単純出力レイアウト(SimpleLayout)がフォーマット出力レイアウト(PatternLayout)よりも出力速度が速いなど、パフォーマンスにも影響します.必要に応じて、ログ情報をできるだけ簡単な出力レイアウト形式で出力できます.c、ログレベルが低いほど出力されるログ内容が多くなり、システム系に大きな影響を及ぼす.d、ログ出力方式の違いは、システム系エネルギーにも一定の影響を及ぼし、非同期出力方式を採用することは同期出力方式より性能が高い.e、ログ出力イベントを受信するたびに1つのログコンテンツを印刷することは、ログコンテンツが一定の大きさに達したときよりも印刷系エネルギーが低い.
4、以上の点が系能に与える影響の4、5点目に対して、ログプロファイルを以下のように配置する.
  
a、ログキャッシュの設定、キャッシュサイズの設定
     
log4j.appender.A3.BufferedIO=true 
     #Buffer     ,   8K,IO BLOCK      8K  
     log4j.appender.A3.BufferSize=8192 
   
 
以上の構成では、ログコンテンツが8 kに達すると、ログ出力先にログが出力されます.
 
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、ログをローカルファイルに記録するのは同じようにローカルファイルを書くLog 4 j自体にbuffer処理入庫があり、非同期方式では必ずしも性能を向上させることはできない(主にキャッシュサイズをどのように構成するか).スレッド間の同期オーバーヘッドは非常に大きい!したがって、ローカルファイルを使用してログを記録する場合は、非同期方式は推奨されません.   
   
b、JMS JMS自身にログを記録することは非同期メッセージをサポートするものであり、JMSメッセージ作成のオーバーヘッドを考慮しなければ、非同期方式の使用も推奨しない.   
  
c、SOCKETに日を記録してログをSocketで送信し、純ネットワークIO操作はフィードバックを必要としないため、時間もかからない
   
d、データベースにログを記録するのはよく知られているJDBCはいくつかの方式の中で最も時間がかかります:ネットワーク、ディスク、データベーストランザクション、すべてJDBC操作を異常に時間がかかります.ここで非同期方式で入庫するのはいい選択です.  
  
e、SMTPとJDBCにログを記録する
5、非同期出力ログの動作原理
AsyncAppenderは,生産者消費者のモデルを用いて,ロギングイベントを対応するAppenderに非同期的に送る.
a、生産者:外部でLog 4 jを応用したシステムのリアルタイムスレッド、リアルタイムで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のオーバーフロー処理の1つとする.
2)AsyncAppenderには簡単なスレッドクラスであるスレッドクラスDispatcherがあり,Runnableインタフェースを実現している.AsyncAppenderのバックグラウンドスレッドです.
Dispatcherがしなければならない仕事は次のとおりです.
①Bufferをロックし、他のBufferを操作するスレッドをブロックします.
②Bufferの容量が満たされているかどうかを見て、満たされている場合はBufferの中のLogging Eventをすべて取り出し、BufferとDiscardSummaryをクリアする.満たされていない場合は、BufferがLogging Eventを満たすのを待って、notify Disaptcherスレッドを指定します.
③取り出した全てのロギングイベントを対応するappenderに渡して後のログ情報をプッシュする.
以上がAsyncAppenderクラスの2つのキー:appendメソッドとDispatcherクラスであり、この2つのキーによってログ情報を非同期でプッシュする機能が実現され、大量のLogging EventがAsyncAppenderに入ると、これらのログ情報を余裕を持って処理することができます.