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 时,如何配置它呢?
@RubenBartelink 在评论中指出了一个非常好的资源。
Serilog for ASP.NET Core 文档中也对此进行了描述。
特别是两阶段初始化部分,其中指出:
两阶段初始化
本页顶部的示例显示了如何在应用程序启动时立即配置 Serilog。
这样做的好处是可以捕获并报告 ASP.NET Core 主机设置期间引发的异常。
首先初始化 Serilog 的缺点是来自 ASP.NET Core 主机的服务(包括
appsettings.json配置和依赖项注入)尚不可用。为了解决这个问题,Serilog 支持两阶段初始化。程序启动时会立即配置初始“引导”记录器,一旦主机加载,该记录器就会被完全配置的记录器取代。要使用此技术,首先将初始
CreateLogger()调用替换为CreateBootstrapLogger():Run Code Online (Sandbox Code Playgroud)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!然后,传递一个回调来
UseSerilog()创建最终的记录器:Run Code Online (Sandbox Code Playgroud)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>(); });值得注意的是,最终记录器完全取代了引导记录器:例如,如果您希望两者都登录到控制台,则需要
WriteTo.Console()在两个位置进行指定,如示例所示。消费
appsettings.json配置使用两阶段初始化,插入
ReadFrom.Configuration(context.Configuration)上例中所示的调用。JSON 配置语法记录在 Serilog.Settings.Configuration README 中。
| 归档时间: |
|
| 查看次数: |
4587 次 |
| 最近记录: |