asp.net-core - 无法使用 Serilog 和 .Net Core 5 捕获实例化错误
问题描述
我有一个带有 Serilog 的 .Net Core 5 应用程序。我正在测试错误日志,并且我有一个无法实例化的类,因为我在 DI 注册中注释掉了一些服务。这是我的 Program.cs 文件:
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.File("Logs/Startup.txt", Serilog.Events.LogEventLevel.Verbose)
.CreateLogger();
try
{
Log.Information("Starting up");
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Application start-up failed");
Environment.Exit(1);
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration))
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
在Startup.txt
文件中,我只看到Information
错误而不是错误。想法?
解决方案
您的初始记录器正在使用File()
,但您稍后调用UseSerilog(callback)
它将用配置文件中的任何内容覆盖它。
CreateBootstrapLogger()
通过允许合并启动和以后的应用程序日志来对所有这些进行排序:
public static int Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.File("Logs/Log.txt") // <-- No longer need a separate startup log
.CreateBootstrapLogger(); // <-- Change this line
try
{
Log.Information("Starting up");
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Application start-up failed");
return 1; // <-- Change this line
}
finally // <-- Add this block
{
Log.CloseAndFlush();
}
return 0; // <-- Add this line
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
.WriteTo.File("Logs/Log.txt") // <-- Add this line
.ReadFrom.Configuration(hostingContext.Configuration))
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
如果您真的不希望在同一个接收器中启动和常规日志事件,您可以初始化一个单独的记录器以进行启动:
public static int Main(string[] args)
{
using var startup = new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.File("Logs/Startup.txt")
.CreateLogger();
try
{
startup.Information("Starting up");
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
startup.Fatal(ex, "Application start-up failed");
return 1; // <-- Change this line
}
return 0; // <-- Add this line
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration))
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
(我仍然建议尽可能避免Environment.Exit()
。)
推荐阅读
- python - 使用返回列表作为值的预设键创建 python 字典
- matlab - 使用Matlab中的haversine计算的笛卡尔距离的标准偏差?
- python - 无法理解为什么正常停止线程会在 Windows 下的 (wx)Python 中挂起该线程的剩余执行代码
- powershell - Powershell 和 Microsoft Edge 自动化
- css - 引导导航栏和轮播的疯狂问题
- python - Material Icon Theme 不突出显示 MacOS 上 VS Code 中的 Pygame 方法
- javascript - 如何使用 windows.WindowState API (JavaScript)?
- reactjs - 在 redux-reduver 中获取数据
- python - while循环,python初学者
- amazon-web-services - 如何在存储桶中为 Canvas LMS 的多个源添加前缀或文件夹