EDIT 2:私はこの問題を解決しました(下記の回答を参照してください)問題は、BufferingForwardingAppenderとBufferingAppenderSkeletonを継承しているすべてのアペンダーに影響する可能性があることに注意してください(それぞれAdoNetAppender、RemotingAppender、SmtpAppender、 SmtpPickupDirAppender)*log4net BufferingForwardingAppenderパフォーマンスの問題
私はlog4netの非常に基本的なベンチをやっていました。私は、BufferingForwardingAppenderでRollingFileAppenderを装飾しようとしました。
私は、RollingFileAppenderを直接経由するのではなく、BufferingForwardingAppenderを使用してパフォーマンスが低下することを経験しました。ここで
は私の設定です:
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="c:\" />
<appendToFile value="false" />
<rollingStyle value="Composite" />
<datePattern value="'.'MMdd-HH'.log'" />
<maxSizeRollBackups value="168" />
<staticLogFileName value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<appender name="BufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender">
<bufferSize value="512" />
<appender-ref ref="RollingLogFileAppender" />
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="BufferingForwardingAppender" />
</root>
そして、ここでは、ベンチマーク(非常に簡単なコード)である:
var stopWatch = new Stopwatch();
stopWatch.Start();
for (int i = 0; i < 100000; i++)
{
Log.Debug("Hello");
}
stopWatch.Stop();
Console.WriteLine("Done in {0} ms", stopWatch.ElapsedMilliseconds);
がRollingFileAppenderから直接出力を行くされています
に完了RollingFileAppenderを飾るBufferingForwardingAppenderを経一方511ms
:約30倍遅くだ14261ミリ秒
に完了
。
私は、ファイルに書き込む前に特定の量のログをバッファリングすることでスピードを上げることができたと思っていましたが、なんらかの理由でそれがさらに悪化しました。
私は設定がOKであるように見えます、これは本当に変です。
誰かが手掛かりを得ましたか?
ありがとうございます!
EDIT 1:
行動は(まだlog4netの公式設定サンプル中の基本BufferingForwardingAppenderラッピング/飾るConsoleAppenderの例があり、厳密ConsoleAppenderを/ラップさえFileAppenderかを飾ることにより、同じ..ですし、何もパフォーマンスに特有の言及)。
調査/プロファイリングを行った後、私は、WindowsIdentity.GetCurrent()の呼び出しでBufferingForwardingAppender内部で大部分の時間が損なわれていることがわかります。毎回
Log.Debug()
を呼び出しています。前のサンプル(上記のサンプルソースでは100K回)に表示されます。このメソッドを呼び出すと、非常にコストがかかるので、避けるか、最小限に抑える必要があります。なぜ、各ログイベントに対して呼び出されるのか、実際にはわかりません。 私は本当に完全に何かを間違って設定していますか、何かが明白でないか、どこかにバグがありましたが、これは私が現在考えようとしていることです...
部分コールスタックは、次のとおり
get_LocationInformation()
に
- AppenderSkeleton.DoAppend
- BufferingAppenderSkeleton.Append
- LoggingEvent.FixVolatileData
- LoggingEvent.get_UserName()
コールされますまた、FixVolatileDataで実行され、高いパーフォーマンスも発生します(s毎回タックトレース)。
私は今、このコンテキストで各ログイベントに対して(FixPolder ...を直接経由して)ラップされたアペンダを経由するのに対して、この非常に高価なFixVolatileData呼び出しが発生する理由を理解しようとしています。この種の操作を実行します。誰かがこのすべてに答えを得た場合を除き、フォローする
今後のアップデート;)
ありがとう!
こんにちは、私たちはスレッド、例外、カスタムフィールドIDを記録しています。我々はlog4net.Appender.AdoNetAppenderを使用しています。 を指定しようとしましたが、その結果、ThreadおよびExceptionの値のロギングが停止されました。また、カスタムIDフィールドが誤ってロギングを開始しました。パフォーマンスはほぼ10倍向上しました。 手掛かりはありますか? –
AdoNetAppenderについては、これらのことが修正されていることを確認する必要があります。このリファレンスドキュメントで修正する必要があるものの値を追加してください:http://logging.apache.org/log4net/release/sdk/log4net.Core.FixFlags.html –
解決に感謝します!したがって、_final_数値は 'RollingFileAppender'でしょう:' BufferingForwardingAppender'の511msと230msまたは350ms(設定に依存します)?確かに改善だけど、思ったほど印象的ではない... – Josep