log4netはSystem.Diagnostics.Traceよりもずっと遅いですか?
-
03-07-2019 - |
質問
ロギングにlog4netと System.Diagnostics.Trace
を使用した場合の違いを調査していますが、私が観察したパフォーマンスの違いに興味があります。
いくつかのシナリオで両方のロギングメソッドのパフォーマンスを比較するテストアプリケーションを作成しましたが、log4netは Trace
クラスよりも大幅に遅いことがわかりました。たとえば、文字列をフォーマットせずに1,000件のメッセージを記録するシナリオでは、log4netの1,000回の試行を超える平均実行時間は9.00msです。 Trace
は平均1.13msで実行されます。私のテストケースの多くは、log4netの実行時間に比較的大きなばらつきがあります。異常値の長い実行の周期的な性質は、GC干渉を示唆しているようです。 CLRプロファイラーをいじると、生成された大量の log4net.Core.LoggingEvent
オブジェクトのコレクションが大量にあることを確認します(公平には、 Trace
は多数の Char []
オブジェクトも同様ですが、log4netのような大きな差異は表示されません。)
ここで心に留めておくべきことの1つは、log4netは Trace
の約9倍遅いように見えますが、その差は1,000回の反復で8msです。これは、パフォーマンスの大幅な低下ではありません。それでも、予想されるユースケースの一部は、何十万回もログに記録するメソッドを呼び出すことであり、これらの数値は私の高速マシンのものです。ユーザーの構成により典型的な低速のマシンでは、差は170ミリ秒から11ミリ秒になりますが、これはほんの少し警告になります。
このパフォーマンスはlog4netに特有のものですか、それともlog4netのパフォーマンスを大幅に向上させることができる落とし穴がありますか?
(注:文字列の書式設定により実行時間が変わる可能性があることを認識しています。リンゴとリンゴを比較しようとしていますが、書式設定のないテストケースと書式設定のあるテストケースがあります。書式設定が使用されているかどうか。)
これまでの話:
- ロバート・グールドが質問に対する最良の答えを持っています。 log4netのパフォーマンスが
Trace
クラスよりもはるかに遅いのを見るのが典型的な場合、私は主に興味がありました。 - Alex Shnayderの答えは興味深い情報ですが、実際には質問の範囲には含まれません。このロギングを導入する意図の半分は、稼働中のシステムでの論理的問題とパフォーマンス問題の両方のデバッグを支援することです。顧客は、高価で大規模なハードウェア構成なしでは再現が難しいことが多い、多くのエキゾチックなシナリオに製品を入れています。私の主な関心事は、「ロギングしない」とおよび「ロギング」バグが発生しないようにシステムに影響を与える可能性があります。最終的に、パフォーマンスの低下の規模は大きくなりますが、規模は小さくなりますので、問題にならないことを期待しています。
解決
yes log4xxxはトレースよりも低速です。通常、トレースはカーネルに近いツールであり、log4xxxははるかに強力なツールです。個人的には柔軟性があるためlog4xxxを好みますが、それほど影響を与えず、本番用のログが本当に必要ない場合は、デバッグではトレースのみで十分なはずです。
注:.Netだけでなくlog4ライブラリを持つすべての言語にまったく同じことが適用されるため、log4xxxを使用します
他のヒント
Common.Loggingライブラリに興味があるかもしれません。既存のロギング実装に対する薄い抽象化ラッパーであり、実行時に好きなロギングフレームワークをプラグインできます。また、パフォーマンスに関するブログ投稿。
hth、 エーリッヒ
私の経験から、ほとんどの場合、log4netのパフォーマンスは問題ではありません。
本当の問題は、「何十万回もログに記録する」必要があるのはなぜですか。実稼働システム。
私が見るように、実稼働環境では最小限の情報のみを記録する必要があり(情報レベルは警告レベルである可能性があります)、必要な場合のみ(サイトで問題をデバッグする)デバッグレベルでデバッグを有効にする必要があります。
両方の長所を使いたい場合は、log4netを使用して、aspnetトレーサーにもログを記録できます。ロギングの特定のイベントに関連付けられたパフォーマンス統計を取得する場合、このオプションをオンにします。
同じタスクでLog4Netを使用する場合と比較して、連続する書き込みを単純なファイルと比較するテストを実行するだけです。Log4NetはStreamWriterに比べて約400倍遅いです。ログファイル。しかし、少量のログエントリに対して非常に便利であり、デバッグすることがわかりました。
場合によっては、個別のスレッドでロギングを分離するソリューションかもしれません。