【发布时间】: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