5

NLog には、${callsite:className=Boolean:fileName=Boolean:includeSourcePath=Boolean:methodName=Boolean}: レンダラーを介して呼び出しサイト情報を含める機能があります。

この機能を実現するために NLog がスタック トレースを取得すると想定しています。

それが事実なのか、それともロギング呼び出しごとに新しいスタック トレースを作成する以上の最適化が NLog にあるのか、多くのログ エントリが書き込まれるアプリケーションでパフォーマンスにどのような影響があるのか​​疑問に思っています。

4

1 に答える 1

4

StackTrace.NET フレームワークは、スタック トレースを取得するためのオプション [1] を、クラスを直接、経由Exception、または文字列として使用する以外に提供していないため、Environment.StackTraceNLog でできることはほとんどありません。さらに、コールスタックは (潜在的に) ログ呼び出しごとに異なります。1 つの例外は、ループ内のログ呼び出しです。しかし、その場合でも、呼び出しが前のものと「同じ場所」から行われたことを NLog が認識できるようにするための機械が必要です。これは、(再び) コールスタックを見て判断するしかありませんでした。

したがって、全体として、NLog はまさにそれを行う必要があると思います: 行われるすべてのログ呼び出しでコールスタックをキャプチャします (呼び出しを処理するすべてのレイアウト/アペンダーではありません) - ちなみに log4net のように、「警告」しますこのオプションは、ログ呼び出しの頻度が高く、パフォーマンスの問題です。

いずれにせよ、 sourceを見てみるといいかもしれませんが、ログ呼び出しごとに 1 つのコールスタックがキャプチャされていることも示されています (デバッガーでステップスルーしていませんが)。

更新完全を期すために、.NET 4.5 以降では、caller info attributesを使用できます。ただし、タイプ名を含めないなど、独自の「制限」があります。ただし、現在 NLog では使用されていません。

[1] 一部の IL レベルの書き換えを使用するか、デバッガーでアプリケーションを実行する以外。

于 2012-09-03T12:49:40.360 に答える