NLogを介してロギングを追加しようとしている.NetコアWebアプリがあります。以前のプロジェクトでは、すべてのクラスの先頭で次のようなものを使用しました:
_private static Logger logger = LogManager.GetCurrentClassLogger();
_
可能な限り、このプロジェクトでより多くのベストプラクティスに従うようにしています。
私の質問は、注入先のクラスの完全修飾名を持つロガーを注入するにはどうすればよいですか?
私のstartup.csファイルでは、これまでのところ次のようになっています。
_services.AddScoped<BLL.Logging.NLogLogger>();
_
現時点では、NLogLogger
クラスはGetCurrentClassLogger()
を介してNLog Loggerのインスタンスを作成します。これを使用すると、実際のクラスではなく "BLL.Logging.NLogLogger"としてのみ名前が報告されますロガーが注入されていること。
質問を単純化してより一般的なものにするには:.Net Coreがクラスを挿入するクラスの名前をどのように渡すことができますか?
私は以下のようなことを考えましたが、それを達成する方法がわかりません:
_services.AddScoped<BLL.Logging.NLogLogger>(serviceProvider => new BLL.Logging.NLogLogger("class name here"));
_
DIを使用して指定ILogger<T>
タイプの代わりにLogger
を使用します。ここで、T
はロガーを使用するクラスタイプであるため、NLogはクラスを認識します。例えば:
public class TodoController : Controller
{
private readonly ILogger _logger;
public TodoController(ILogger<TodoController> logger)
{
_logger = logger;
}
}
私は質問に正確に答えたわけではありませんが、許容できる解決策を見つけたと思います。
まず、「LoggerFactory」を作成します。「LoggerFactory」は、「GetLogger」と呼ばれる単一のメソッド(具象NLog Loggerを作成し、クラス名をパラメーターとして受け入れる)を持ち、ロガーの代わりにこのファクトリーを直接注入します。
LoggerFactory:
public class LoggerFactory : ILoggerFactory
{
public ILogger GetLogger(string fullyQualifiedClassName)
{
return new NLogLogger(fullyQualifiedClassName);
}
}
NLogLogger:
public class NLogLogger : ILogger, INLogLogger
{
NLog.Logger mylogger;
public NLogLogger(string fullyQualifiedClassName)
{
mylogger = NLog.LogManager.GetLogger(fullyQualifiedClassName);
}
}
Startup.cs:
services.AddScoped<BLL.Logging.ILoggerFactory>();
私のコントローラークラスでは、私は持っています:
private BLL.Logging.ILogger logger;//my NLogLogger inherits this interface
public HomeController(BLL.Logging.ILoggerFactory loggerFactory)
{
logger = loggerFactory.GetLogger(this.GetType().FullName);
}
したがって、実際に私が実際に行ったのは、実際のロガー自体を注入することではなく(@Stevenは、私がやろうとしていた方法では不可能であることを示しています)、代わりにロガーのインスタンスを作成するためのユーティリティを注入しましたNLogをラップします。
クラス内にロガーを作成する責任はまだありますが、少なくとも、基盤となるロギングフレームワーク(NLog)から切り離しました。