C# 在执行Environment.Exit()之前,如何刷新dotnet core应用程序中的所有记录器

C# 在执行Environment.Exit()之前,如何刷新dotnet core应用程序中的所有记录器,c#,asp.net-core,.net-core,C#,Asp.net Core,.net Core,基本上,我有一个已知的老问题,即应用程序崩溃并且没有调试日志,因为应用程序在写入日志之前就终止了 经典的方法是捕获main中的所有异常,并刷新异常块中的所有日志缓冲区。此外,添加睡眠以降低重启速度并允许缓冲区完成刷新 我使用serilog,我发现了这张票: 它建议按照我的建议去做(代码粘贴在下面),但我不确定它是否会关闭并刷新所有记录器,而不仅仅是主记录器 我需要刷新更多的日志才能获取所有日志吗 本例假设ConfigureLogging()设置了记录器,但在实际的asp.netcore main

基本上,我有一个已知的老问题,即应用程序崩溃并且没有调试日志,因为应用程序在写入日志之前就终止了

经典的方法是捕获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
        }
    }