C# 在执行Environment.Exit()之前,如何刷新dotnet core应用程序中的所有记录器
基本上,我有一个已知的老问题,即应用程序崩溃并且没有调试日志,因为应用程序在写入日志之前就终止了 经典的方法是捕获main中的所有异常,并刷新异常块中的所有日志缓冲区。此外,添加睡眠以降低重启速度并允许缓冲区完成刷新 我使用serilog,我发现了这张票: 它建议按照我的建议去做(代码粘贴在下面),但我不确定它是否会关闭并刷新所有记录器,而不仅仅是主记录器C# 在执行Environment.Exit()之前,如何刷新dotnet core应用程序中的所有记录器,c#,asp.net-core,.net-core,C#,Asp.net Core,.net Core,基本上,我有一个已知的老问题,即应用程序崩溃并且没有调试日志,因为应用程序在写入日志之前就终止了 经典的方法是捕获main中的所有异常,并刷新异常块中的所有日志缓冲区。此外,添加睡眠以降低重启速度并允许缓冲区完成刷新 我使用serilog,我发现了这张票: 它建议按照我的建议去做(代码粘贴在下面),但我不确定它是否会关闭并刷新所有记录器,而不仅仅是主记录器 我需要刷新更多的日志才能获取所有日志吗 本例假设ConfigureLogging()设置了记录器,但在实际的asp.netcore main
你的意思是在你调用CloseAndFlush后没有写入日志吗?你用什么样的水槽?你能确认应用程序崩溃是由你自己的代码引起的,并且异常已经被代码捕获了吗?@FeiXue MSFT no这都是外围的。我正在运行一个dotnet core控制台应用程序,它不使用ASP.net core。问题在于,您基本上没有记录器本身的实例,因此无法显式刷新它。
public static int Main(string[] args)
{
ConfigureLogging(); // set up Serilog
try
{
Log.Logger.Information("Custom.API Server is starting.");
var webHost = BuildWebHost(args);
webHost.Run();
Log.Logger.Information("Custom.API Server is starting.");
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly.");
return 1;
}
finally
{
Log.CloseAndFlush();
Thread.Sleep(2000); // give serilog / seq time to flush the messages
}
}