LogManager.GetLoggerへのlog4net引数


98

なぜほとんどのlog4netの例がこれを行うことによってクラスのロガーを取得するのですか?

private static ILog logger = 
    LogManager.GetLogger(
    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

typeof(MyClass)を渡すだけではなく、

private static ILog logger = LogManager.GetLogger(typeof(MyClass));

最初のオプションでは特定のクラス名を入力する必要がないという事実以外に、これを行う理由は他にありますか?

回答:


93

理由があると思います。そうすることで、クラス名を気にする必要がなくなり、ボイラープレートのコードをコピーして新しいクラスに貼り付けることができます。

公式の回答については、静的ブロックでクラスの完全修飾名を取得するにはどうすればよいですか?を参照してください。でlog4netのよくある質問


わかりました。そのリンクのおかげで、私は以前にそれを見たことはありませんでした
Andy White

これは古いものですが、ボイラーコードとして貼り付ける場合に備えて、私の答えを確認してください:)
Noctis

このコードをカットアンドペーストすることで、開発時間を少し節約できます。ただし、文字列定数の使用や 'typeof()'の呼び出しとは対照的に、 'GetCurrentMethod()'の呼び出しにはコストがかかります。コードの存続期間中にこれが呼び出される回数と、クラス名を入力するのにかかる時間を合計すると、ほとんどメリットがなく、コードの速度が低下していると思います。
ヤング

1
思ったほど遅くはありません。これは静的呼び出しであるため、アプリドメインごとにクラスごとに1回の呼び出しが行われます。たとえば、300のクラスがある場合、アプリの存続期間中に最大300の呼び出しがあります
Paulハッチャー

タイプ名を取得するためにリフレクションを使用する意味はありません。コピー/ペーストは怠惰であり、パフォーマンスヒットを得るので、なぜ名前だけを取得しないのですか?
MeTitus

8

私はNLogユーザーです。通常、これは次のようになります。

var _logger = LogManager.GetCurrentClassLogger();

Log4Netでリフレクションを行う必要があるのは少し奇妙に思えたので、NLogソースコードを調べました。

[MethodImpl(MethodImplOptions.NoInlining)]
public static Logger GetCurrentClassLogger()
{
    string loggerName;
    Type declaringType;
    int framesToSkip = 1;
    do
    {
#if SILVERLIGHT
        StackFrame frame = new StackTrace().GetFrame(framesToSkip);
#else
        StackFrame frame = new StackFrame(framesToSkip, false);
#endif
        var method = frame.GetMethod();
        declaringType = method.DeclaringType;
        if (declaringType == null)
        {
            loggerName = method.Name;
            break;
        }
        framesToSkip++;
        loggerName = declaringType.FullName;
    } while (declaringType.Module.Name.Equals("mscorlib.dll", StringComparison.OrdinalIgnoreCase));
    return globalFactory.GetLogger(loggerName);
}

ボイラーコードの一部としてリフレクションを貼り付ける代わりに、拡張機能または静的メソッドとしてLog4Netに似たものを書くと思います:)


7

あなたが言うように-クラスの名前を知らなくてもメソッドにロガーを作成できるので便利ですが(簡単なことです)、呼び出しの名前を変更しなくてもクラス間でメソッドをカットアンドペーストできます。


3

その理由は、.DeclaringType()メソッドを使用してランタイム型の型を取得するためだと思います。基本クラスでロガーを使用しても、ロガーの出力でオブジェクトの実際のタイプを確認できます。これにより、調査がはるかに便利になります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.