【问题标题】:ILogger in Asp.net Core and SerilogAsp.net Core 和 Serilog 中的 ILogger
【发布时间】:2021-07-29 10:00:31
【问题描述】:

我有一个问题,

如果我代表 Microsoft logger 在 Serilog 中使用 ILogger,有什么问题吗?

public void ConfigureServices(IServiceCollection services)
{
     services.AddSingleton(Log.Logger);
}

然后在 Serilog 命名空间中使用 ILogger。

 _logger.Error(exception, "Error", exception.Message, exceptionId);

你的想法是什么?

【问题讨论】:

  • Log.Logger 已经是静态单例了,不需要去DI注册,直接使用静态Logger即可。

标签: asp.net-core serilog


【解决方案1】:

Microsoft.Extensions.ILogger 是一种抽象,可将您的应用程序代码(写入日志条目的代码)与底层日志记录框架分离。

使用这种抽象带来的好处是,您可以轻松更改下面的日志框架(例如,将 Serilog 替换为 NLog),而不必更新应用程序代码中的所有引用。

此外,使用 Microsoft 的抽象还允许您配置应用程序代码的日志记录和您可能在一个地方使用的 Microsoft SDK 的日志记录。

抽象的缺点是您必须同意所有日志框架提供的通用最小接口。以这种方式使用特定于框架的功能并不容易。

所以大多数时候我会建议使用抽象。

如果您有来自 Serilog 的非常具体的功能,您想与之交互,可以考虑直接使用来自 Serilog 的 ILogger。 但是,您也可以在提供者注册中高度配置 serilog,并且可能会两全其美。

【讨论】:

    【解决方案2】:

    您可以配置 Serilog 工厂接口 代替内置 Logger 工厂 来创建 ILogger

    首先在 program.cs 中,使用 CreateHostBuilder() 中的 UserSerilog() 方法将 Serilog ILoggerFactory 添加到您的 IHostBuilder:

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        new HostBuilder()
            .ConfigureHostConfiguration(builder => { /* Host configuration */ })
            .ConfigureAppConfiguration(builder => { /* App configuration */ })
            .ConfigureServices(services =>  { /* Service configuration */})
            .UseSerilog(); // <- Add this line
     }
    

    图书馆如何在幕后工作

    从表面上看,完全替换默认的 ASP.NET Core 日志系统以使用不同的系统似乎很重要。幸运的是,由于使用了接口、松耦合和依赖注入,代码非常简单!我们之前使用的整个扩展方法如下图所示:

    public static class SerilogHostBuilderExtensions
    {
     public static IHostBuilder UseSerilog(this IHostBuilder builder, 
        Serilog.ILogger logger = null, bool dispose = false)
     {
        builder.ConfigureServices((context, collection) =>
            collection.AddSingleton<ILoggerFactory>(services => new 
        SerilogLoggerFactory(logger, dispose)));
        return builder;
      }
    }
    

    UseSerilog() 扩展调用 IHostBuilder 上的 ConfigureServices 方法,并将 SerilogLoggerFactory 的实例添加为应用程序的 ILoggerFactory。每当应用需要 ILoggerFactory(创建 ILogger)时,就会使用 SerilogLoggerFactory

    更多信息请查看Link

    【讨论】:

      猜你喜欢
      • 2020-08-08
      • 2019-02-07
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      相关资源
      最近更新 更多