主に NLog ラッパーの使用に関心があり、呼び出しサイト情報を維持できる場合は、以前の質問に対する私の回答を参照してください。
ラッパーの使用時に Nlog Callsite が間違っている
簡単に言うと、NLog Log メソッドを使用して、ラッパーのタイプを渡すことができます。次に、NLog callsite LayoutRendererを使用すると、NLog は、自分で把握しなくても、callsite 情報を把握できるようになります。
したがって、LogWrapper には次のようなメソッドが含まれている可能性があります。
public static void Informational(string fmt, Exception exception)
{
LogEventInfo le = new LogEventInfo(LogLevel.Info, logger.Name, null, fmt, exception.ToString());
logger.Log(typeof(LogWrapper), le);
}
キーはtypeof(LogWrapper)
、最初の引数としてラッパー ()の型を渡すことLogger.Log
です。NLog はその値を使用して、その型が現在の MethodInfo の DeclaringType であることがわかるまで、コール スタックを上に移動します。NLog はそのスタック フレームを実際の呼び出しサイトの前の最後のスタック フレームとして扱うため、NLog はそれを確認した後にもう 1 レベル上がります。
NLog にも Exception LayoutRenderer があることを知っておく必要があるため、自分で exception.ToString() を使用する必要はありません。
ダニエル・ヒルガースがコメントでリンクした質問には興味深いコードが含まれていますが、NLog が「無料」で取得できる情報を判断するために一連のコードを追加する場合は、十分に注意する必要があると思います。ロギング目的でのみ必要な場合は、NLog に任せることをお勧めします。他の目的が必要な場合は、おそらく自分で解決するしかありません。
余談ですが、このスタイルを使用してロギング呼び出しを行わないこともお勧めします。
LogWrapper.Informational(string.Format(" {0} starts {1}",
MethodBase.GetCurrentMethod().DeclaringType.Name, MethodBase.GetCurrentMethod().Name));
LogWrapper.Informational メソッドが NLog の Logger.Info に委譲する場合、ログがオンになっていない場合、またはログ レベルが Info よりも低い場合 (警告、エラー、致命的など) に、追加の作業を行っています。現在のログ レベルの設定が原因で、ステートメントが実際にログに記録されない場合でも、文字列をフォーマットしており、呼び出しサイト情報を取得するために 2 つの比較的高価な呼び出しを行っています。