Asp.net Core 和 Serilog 中的 ILogger

ILogger in Asp.net Core and Serilog

我有一个问题,

如果我代表 Microsoft 记录器在 Serilog 中使用 ILogger,会有任何问题吗?

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

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

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

你的想法是什么?

您可以配置 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 核心日志系统以使用不同的系统似乎很重要。幸运的是,由于使用了接口、松耦合和依赖注入,代码非常简单!我们之前使用的整个扩展方法如下所示:

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

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

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

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

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

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

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