1. ホーム
  2. c#

[解決済み] なぜロガーはクラスごとに使用することを推奨しているのか?

2023-05-07 06:27:28

質問

NLogのドキュメントにある通りです。

ほとんどのアプリケーションでは、1つのクラスにつき1つのロガーを使用し、ロガーの名前はクラスの名前と同じになります。

これはlog4netの運用方法と同じです。なぜこれが良い習慣なのでしょうか?

どのように解決するのですか?

log4netでは、クラスごとに1つのロガーを使用することで、ログメッセージのソース(つまり、ログに書き込むクラス)を簡単に捕捉することができます。 クラスごとに 1 つのロガーがなく、代わりにアプリ全体で 1 つのロガーがある場合、ログ メッセージがどこから来ているかを知るために、より反射的なトリックに頼る必要があります。

以下を比較してください。

クラスごとのログ

using System.Reflection;
private static readonly ILog _logger = 
    LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);    

public void SomeMethod()
{
    _logger.DebugFormat("File not found: {0}", _filename);
}

1アプリにつき1つのロガー(またはそれに類するもの)

Logger.DebugFormat("File not found: {0}", _filename); // Logger determines caller

-- or --

Logger.DebugFormat(this, "File not found: {0}", _filename); // Pass in the caller

2 番目の例を使用すると、ロガーはスタックトレースを構築して、誰がそれを呼び出したかを確認する必要があります。 logger-per-class スタイルでは、まだこれを行いますが、呼び出しごとに 1 回ではなく、クラスごとに 1 回行うことができ、深刻なパフォーマンスの問題を排除します。