在配置准备好之前配置Serilog?

Noc*_*ceo 3 .net c# configuration serilog

我有一个 Web api (.NET Core 3.1),它使用 Serilog 进行日志记录。Serilog很早就被添加到了IWebHostBuilder

public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
    return WebHost
        .CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseSerilog((context, configuration) =>
        {
            if (context.HostingEnvironment.IsDevelopment())
            {
                configuration.WriteTo.Console(LogEventLevel.Debug);
                return;
            }

            configuration.WriteTo.ApplicationInsights(TelemetryConverter.Traces, LogEventLevel.Error);
        });
}
Run Code Online (Sandbox Code Playgroud)

这意味着(据我所知)我此时需要已经配置了记录器。所以这是我主要做的第一件事:

public static int Main(string[] args)
{
    Log.Logger = new LoggerConfiguration()
        .ReadFrom.Configuration(Configuration)
        .CreateLogger();

    var host = CreateWebHostBuilder(args).Build();
    host.Run();
}
Run Code Online (Sandbox Code Playgroud)

但该线路.ReadFrom.Configuration(Configuration)需要进行配置。StartUp这通常是在此时尚未运行的(同样,afaik)中完成的。显然我可以LoggerConfiguration稍后移动,但.UseSerilog会在配置之前调用。

IConfugration那么,当我还没有设置Serilog 时,如何配置它呢?

Lau*_*iot 8

@RubenBartelink 在评论中指出了一个非常好的资源。

Serilog for ASP.NET Core 文档中也对此进行了描述。

特别是两阶段初始化部分,其中指出:

两阶段初始化

本页顶部的示例显示了如何在应用程序启动时立即配置 Serilog。

这样做的好处是可以捕获并报告 ASP.NET Core 主机设置期间引发的异常。

首先初始化 Serilog 的缺点是来自 ASP.NET Core 主机的服务(包括appsettings.json配置和依赖项注入)尚不可用。

为了解决这个问题,Serilog 支持两阶段初始化。程序启动时会立即配置初始“引导”记录器,一旦主机加载,该记录器就会被完全配置的记录器取代。要使用此技术,首先将初始CreateLogger()调用替换为CreateBootstrapLogger()

using Serilog;
using Serilog.Events;

public class Program
{
    public static int Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
            .Enrich.FromLogContext()
            .WriteTo.Console()
            .CreateBootstrapLogger(); // <-- Change this line!
Run Code Online (Sandbox Code Playgroud)

然后,传递一个回调来UseSerilog()创建最终的记录器:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .UseSerilog((context, services, configuration) => configuration
            .ReadFrom.Configuration(context.Configuration)
            .ReadFrom.Services(services)
            .Enrich.FromLogContext()
            .WriteTo.Console())
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });
Run Code Online (Sandbox Code Playgroud)

值得注意的是,最终记录器完全取代了引导记录器:例如,如果您希望两者都登录到控制台,则需要WriteTo.Console()在两个位置进行指定,如示例所示。

消费appsettings.json配置

使用两阶段初始化,插入ReadFrom.Configuration(context.Configuration)上例中所示的调用。JSON 配置语法记录在 Serilog.Settings.Configuration README 中。