gpt4 book ai didi

asp.net-mvc - Azure 上的 ASP.NET MVC 5 应用程序不会记录异常

转载 作者:行者123 更新时间:2023-12-03 01:49:03 26 4
gpt4 key购买 nike

将 ASP.NET MVC 5 应用程序部署到 Azure 应用服务插槽时,我很难记录未捕获的异常。当发生未捕获的异常时,应用程序会正确返回 500 和标准“错误。处理您的请求时发生错误”Error.cshtml 页面,但从未在我的任何日志中记录任何提及该异常的内容。

当前设置:

  • Azure 设置:
    • 应用程序日志记录:开启,在信息级别记录到文件系统和存储 blob
    • 详细错误消息:开启
    • 失败的请求跟踪:开启
  • 应用程序设置:
    • 使用 NLog 写入文件和跟踪目标,这在其他地方和捕获的异常上运行良好
    • 尚未明确设置<customErrors />在我的 Web.configs 中,但它们按照预期和期望显示为本地关闭和远程打开
    • 添加了Application_Error覆盖到 Global.asax (见下文)
    • 添加了自定义 ExceptionLoggingFilter (见下文)并将其注册在我的FilterConfig.cs中管道作为第一项

Global.asax 中的 Application_Error 覆盖:

protected void Application_Error(Object sender, EventArgs e)
{
Trace.TraceError("Uncaught exception bubbled up. Details: {0}", e);

Logger log = LogManager.GetCurrentClassLogger();
Exception ex = Server.GetLastError();

log.Fatal(ex, "Uncaught exception bubbled up to MVC root.");
}

在 GlobalFilters 中注册的客户 ExceptionLoggingFilter:

private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

public void OnException(ExceptionContext filterContext)
{
var ex = filterContext.Exception;
var request = filterContext.HttpContext.Request;

Logger.Fatal(ex, "Uncaught exception bubbled up to MVC root.");
}

FilterConfig.cs:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new ExceptionLoggerFilter());
filters.Add(new HandleErrorAttribute());
}

NLog.config:

...
<targets async="true">
<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message} ${exception:format=tostring}" />
<target xsi:type="Trace" name="trace" layout="${logger} ${message} ${exception:format=tostring}" />
<!-- another target for sending data to Slack here... -->
</targets>
...
<rules>
<logger name="*" minlevel="Debug" writeTo="f" />
<logger name="*" minlevel="Trace" writeTo="trace" />
</rules>
...

我尝试过的:

我创建了一个故意触发未捕获异常的操作 ( var neverResult = Convert.ToInt32("a"); ),当我导航到该页面时,我得到了自定义错误页面。实现<customErrors mode="Off" />在 Azure 上的生产环境中,它实现了我所期望的功能:我知道在导航到该示例操作时会看到完整的错误消息和堆栈跟踪,但我没有收到任何日志记录,不是来自 NLog、跟踪、观看流日志,什么也没有。

我已经尝试添加额外的处理程序和过滤器来记录错误,如上所述,但仍然没有任何结果,尽管我通过远程调试知道代码都在这些额外的处理程序中运行。在本地,一切都记录得很好。

救命!

我有点不知所措,甚至不知道下一步该去哪里。不确定我是否需要查看 Azure 设置、ASP.NET 如何处理事物,或者 NLog 是否已关闭(即使它记录其他所有内容都很好)。任何方向都将不胜感激。

更新:添加了实际的过滤器配置和 NLog 配置。

最佳答案

我实际上用你的配置尝试了这个并发现了问题。

如果您使用 Logger.Fatal,则由于某种原因,跟踪消息会以详细级别写入。更改您的日志过滤器以使用错误函数:

Logger.Error(ex, "Uncaught exception bubbled up to MVC root.");

此外,异常过滤器从后到先运行,因此在您的情况下,HandleErrorAttribute 首先运行。然而,这并不意味着您的过滤器不会运行(ASP.NET Core 在这方面有点不同)。

NLog的Fatal函数调用Fail function Trace 类的类,该类应该用于在 Windows 环境中向用户显示消息框。由于某种原因,它处于 IIS 上的详细级别。

TL;DR不要使用Fatal(),使用Error()

关于asp.net-mvc - Azure 上的 ASP.NET MVC 5 应用程序不会记录异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41773572/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com