Serilog.ILogger 可以转换为 Microsoft.Extensions.Logging.ILogger 吗?

Chr*_*ris 5 logging serilog

我有记录到 Microsoft.Extensions.Logging.ILogger (和扩展方法,主要是)的代码。

我已将 Serilog 配置为实际进行日志记录。

我找不到将 Serilog.ILogger 转换为 Microsoft.Extensions.Logging.ILogger 的方法。我认为 Serilog 会实现 Microsoft.Extensions.Logging.ILogger,但它似乎没有。

有没有办法在 Serilog Logger 上获得 Microsoft.Extensions.Logging.ILogger 接口? - - 谢谢

我的代码是:

        Serilog.Core.Logger seriLogger = new Serilog.LoggerConfiguration()
            .WriteTo.Console()
            .CreateLogger();
        Serilog.ILogger seriILogger = seriLogger;

        Microsoft.Extensions.Logging.ILogger msLogger = seriILogger;
Run Code Online (Sandbox Code Playgroud)

产生

Cannot implicitly convert type 'Serilog.ILogger' to 'Microsoft.Extensions.Logging.ILogger'. An explicit conversion exists (are you missing a cast?)
Run Code Online (Sandbox Code Playgroud)

演员表给我一个运行时错误:

无法将“Serilog.Core.Logger”类型的对象转换为“Microsoft.Extensions.Logging.ILogger”

mih*_*ins 53

除了安装之外,Serilog.AspNetCore您还可以安装Serilog.Extensions.Logging和使用这些代码行。这将为您提供一些如何UseSerilog()在幕后工作的想法(嗯,或多或少是这样的:D)。

var serilogLogger = new LoggerConfiguration()
    .Enrich.FromLogContext()
    .MinimumLevel.Verbose()
    .WriteTo.Debug() // Serilog.Sinks.Debug
    .CreateLogger();

var microsoftLogger = new SerilogLoggerFactory(serilogLogger)
    .CreateLogger<IMyService>(); // creates an instance of ILogger<IMyService>
Run Code Online (Sandbox Code Playgroud)

或者,如果您需要在 DI 容器中使用记录器,请使用以下代码行:

Log.Logger = serilogLogger;

var container = new ServiceCollection()
    .AddLogging(x => x.AddSerilog())
    .BuildServiceProvider(true);
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个,因为它独立于所有 ASPNET Core 基础设施,允许我将 ILogger 传递给库并从中删除 Serilog 的依赖关系。 (6认同)

Rub*_*ink 7

TL;DR 不,不是直接的。编译器正确地拒绝转换,因为 Serilog ILogger / Logger 不直接实现 MELILogger接口(Serilog 项目开始于 2012 年左右,并且始终设计为独立于该框架或以后的任何特定框架运行......)

然而,有一个桥接层实现了 MELILogger接口,转发到 Serilog ILogger-有一篇关于此主题的介绍文章提供了很好的概述。根据您的应用程序类型,您可能不需要所有这些,但它应该为您提供一些关于它们如何组合在一起的背景信息。