将 NLog.ILogger 转换为 Microsoft.Extensions.Logging

mar*_*399 5 c# logging nlog microsoft-extensions-logging

我在解决方案中使用 NLog 作为日志记录提供程序,但某些项目已迁移到 Microsoft.Extensions.Logging。我们仍在评估是否将其余代码也迁移到此,但与此同时,我们需要以某种方式将实例转换NLog.ILoggerMicrosoft.Extensions.Logging.ILogger<T>实例。

我知道使用NLog.Extensions.Logging包可以很容易地完成,添加 NLog 作为提供程序:

ILoggerFactory factory = LoggerFactory.Create(builder =>
{
    builder.AddNLog();
});
return factory.CreateLogger<MyClass>();
Run Code Online (Sandbox Code Playgroud)

但这种方法实际上使用静态 NLog 内容创建一个 NLog 提供程序,而不是NLog.ILogger我从其他代码部分收到的实例。

那么,有没有办法在这个转换中使用这个NLog.ILogger实例呢?我错过了什么吗?

Rol*_*sen 4

除非您使用独立的 NLog LogFactory 实例,否则您始终可以这样做:

AddLogging(new NLog.Extensions.Logging.NLogLoggerFactory());
Run Code Online (Sandbox Code Playgroud)

您还可以将其存储NLogLoggerFactory为静态单例,这样您就可以在任何地方重用它,直到每个人都转换为依赖注入。

但如果你想让它变得漂亮(听起来永远不会),那么遗憾的是 NLog ILogger 引用了 NLog LogFactory,所以你可以这样做:

NLog.ILogger nlogLogger = ??;
var nlogProvider = new NLog.Extensions.Logging.NLogLoggerProvider(nlogLogger.Factory);
var nlogFactory = new NLog.Extensions.Logging.NLogLoggerFactory(nlogProvider);
AddLogging(nlogFactory);
Run Code Online (Sandbox Code Playgroud)