【问题标题】:How to capture and log startup errors如何捕获和记录启动错误
【发布时间】:2021-01-13 19:06:52
【问题描述】:

我在下面的代码中的目标是创建一个根异常处理程序,它将处理所有未处理的错误。当我在 Azure 上的 IIS 下运行我的 Web 应用程序时,它会立即崩溃。日志文件如下所示。 当我在命令行运行程序时,我可以看到错误。

我的问题是:

为什么没有记录错误?

如何编写处理程序以便记录所有错误?

程序.cs

public class Program
{
    public static void Main(string[] args)
    {
        string env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
        string logRoot = null;

        if (env == "Development")
            logRoot = "c:\\serilog\\myDomain.Web\\log";
        else
            logRoot = "..\\..\\serilog\\myDomain.Web\\log";   // Create logs in D:\home\serilog


        Log.Logger = new LoggerConfiguration()
           .WriteTo.File(logRoot, rollingInterval: RollingInterval.Day, restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Information)
           .CreateLogger();

        try
        {
            Log.Information("myDomain.Web - Program.Main started.");
            Log.Information("Environment is: {env}", env);
            CreateHostBuilder(args).Build().Run();
        }
        catch (Exception ex)
        {
            Log.Error(ex.ToString());
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }

日志文件

2021-01-07 15:58:44.833 +00:00 [INF] myDomain.Web - Program.Main 已启动。

2021-01-07 15:58:45.009 +00:00 [INF] 环境为:null

错误(未记录)

D:\home\site\wwwroot>myDomain.Web.exe 暴击:Microsoft.AspNetCore.Hosting.Diagnostics[6] 应用程序启动异常 System.IO.DirectoryNotFoundException: D:\home\site\wwwroot\StaticHTML
在 Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(字符串根,ExclusionFilters 过滤器) 在 Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(字符串根) 在 D:\a\1\s\myDomain.Web\Startup.cs:line 57 中的 LeaderAnalytics.myDomain.Web.Startup.Configure(IApplicationBuilder app, IWebHostEnvironment env) at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)

编辑:显示错误处理程序被调用

显示的异常处理程序是根异常处理程序。为了证明它应该处理我引用的特定异常,我用throw statement 替换了我的代码(因为我的代码在 dev 中工作但在 prod 中失败)并观察到处理程序被调用,如下图所示。

throw new Exception("boo");
app.UseStaticFiles(new StaticFileOptions // this line fails in prod

【问题讨论】:

  • 嗨!您还没有显示CreateHostBuilder() 的代码 - 如果您希望框架中的错误到达 Serilog,则需要指定 UseSerilog()。 HTH!
  • @NicholasBlumhardt 感谢您的回复。我正在登录 catch 块,所以如果 CreateHostBuilder 抛出并且错误未处理(如前所示的情况),它应该流向 Main 中的 catch 块并被记录。

标签: serilog


【解决方案1】:

感谢上面的 Nicholas 评论,我终于明白了。

https://nblumhardt.com/2019/10/serilog-in-aspnetcore-3/

    public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .UseSerilog() // <- Add this line
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

【讨论】:

  • 在 .net 6 中略有不同: var builder = WebApplication.CreateBuilder(args); builder.Logging.AddSerilog();
【解决方案2】:

看起来没问题。但是您是否在 startup.cs 的 configureservice 方法中添加了日志的依赖项 (DI) 或相关的日志框架类?

像这样:public void ConfigureServices(IServiceCollection services) { services.AddSingleton&lt;ILogger, Logger&gt;(); }

【讨论】:

  • Log 是提供 Logger 对象的静态类。我只是使用Log.Logger...
猜你喜欢
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
相关资源
最近更新 更多