将 Serilog 与 Microsoft.Extensions.Logging.ILogger 一起使用

mor*_*eng 18 c# logging serilog .net-core ilogger

我已经使用 Host 创建了一个 .NET Core 3.1 项目,IoC 容器IServiceCollection使用ILogger<T>来自Microsoft.Extensions.Logging. 我现在需要实现更高级的日志记录并决定使用 Serilog。

我认为从 .NET 内置记录器切换到 Serilog 会轻而易举。但令我惊讶的是,Serilog 正在使用它自己的ILogger界面——太糟糕了!所以现在我需要更新所有地方以使用 Serilog ILogger,或者使用 .NET CoreILogger<T>接口实现 Serilog 。

我的问题是 - 真的不可能将 Serilog 与 ILogger 接口一起使用Microsoft.Extensions.Logging吗?会聪明很多!

Shu*_*min 30

对于 .NET 6 及更高版本

using Serilog;

var builder = WebApplication.CreateBuilder(args);

builder.Host.UseSerilog((ctx, lc) => lc
    .WriteTo.Console()
    .ReadFrom.Configuration(ctx.Configuration));

Run Code Online (Sandbox Code Playgroud)

参考:这里

  • 在引用这些行之前,您需要运行 ASP.NET Core 的“dotnet add package Serilog.AspNetCore”或“Serilog.Extensions.Hosting”。 (2认同)
  • @MassDotNet 您将使用“Hosting”来运行控制台应用程序。 (2认同)

Sea*_*ean 22

Serilog.Extensions.Logging程序集中有一个IloggingBuilder被调用的扩展方法AddSerilog(它在 Serilog 命名空间中),它允许您使用 Serilog 进行日志记录。例如:

.NET Core 2.2 及更早版本(使用WebHost):

WebHost.CreateDefaultBuilder(args)
    .ConfigureLogging(logging =>
    {
        logging.ClearProviders();
        logging.AddSerilog();
    });
Run Code Online (Sandbox Code Playgroud)

.NET Core 3.1 及更高版本(Host对 Web 或控制台应用程序使用泛型):

Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>()})
    .UseSerilog();
Run Code Online (Sandbox Code Playgroud)

现在ILoggerILogger<>实现将调用 Serilog。

  • 如果您使用通用主机,则有 Serilog.Extensions.Hosting 包,它具有 UseSerilog 方法来配置 Serilog 设置 (10认同)

vib*_*006 11

除了使用builder.host.UseSeriLog()扩展方法之外的方法。这是更优雅的方式(我们可以在外部控制台或单元测试 ILogger 中使用,而无需实现主项目)

  1. 安装 Nuget 包Serilog.Extensions.Logging和 core 包Serilog
  2. 像您已经做的那样初始化记录器配置。例如,典型的日志记录配置将写入控制台,如下所示Log.Logger = new LoggerConfiguration).WriteTo.Console().CreateLogger()
  3. 使用这样的ILoggerFactory扩展方法AddSeriLog()ILoggerFactory factory = new LoggerFactory().AddSerilog(Log.Logger);
  4. 只需返回factory.CreateLogger<T>();
public static Microsoft.Extensions.Logging.ILogger LoggingInstance<T>()
{
  Serilog.Log.Logger = Serilog.Log.Logger ?? new LoggerConfiguration().WriteTo.(xxxxYourSinksxxxx).CreateLogger();
  ILoggerFactory factory = new LoggerFactory().AddSerilog(Log.Logger);            
  return factory.CreateLogger<T>();
}
Run Code Online (Sandbox Code Playgroud)

它的用法就像

var logger = LoggingInstance<YourModel>();