Azure门户:如何查看调用堆栈

时间:2018-11-02 14:14:21

标签: c# asp.net asp.net-mvc azure asp.net-web-api

抱歉,这不是一个简短的问题:

背景

我有一个B1 Azure网站,在我生命中,无法获得调用堆栈的异常。

在相同的解决方案中,WebAPI与网站并排托管,这是不寻常的。我相信,几乎所有配置都是通过该解决方案完成的。门户中的大多数内容可能都是全新站点的默认设置。

我将是第一个承认我是Azure的新手。我以前曾经托管过一些非常简单的ASP网站(大多数是.NET之前的版本)。至少可以说,我发现Azure门户网站不胜枚举。因此,我为什么在这里!

我寻找异常的主要地方是在Application Insights中的“失败”,“异常”选项卡下。尽管通常(并非总是...)显示有500个,但绝大多数情况下,它不会显示任何调用堆栈。

情况

几次它确实捕获了一个调用栈,这是您的普通机器人在随机目录中拨动……不是我需要立即调试的严重异常。我回想起曾经听说过Azure将使用“ AI来确定保留哪些调用栈”或类似的行销方式,但是我找不到与此有关的任何设置。即使这个市场说法是正确的,为什么还要将调用堆栈记录到日常的bot尝试中,却是罕见的应用程序限制异常呢?

一个月左右之前,我尝试通过Visual Studio调试实时网站,但出现错误,提示找不到Internet Explorer。考虑到这是2018年,微软已经迁移到Edge,我完全不知道为什么要Internet Explorer。我确实找到了对此的回应,说要破解注册表并重新安装Internet Explorer,但这在当时似乎有些过分。

通过Visual Studio的嵌入式Azure门户查看Azure错误似乎显示出与Azure门户非常相似的数据。找不到调用栈。

许多年前,针对Http Server错误设置了经典警报,直到今天仍在触发。它不会触发僵尸程序在站点上引发的HttpExceptions,但是对于重要的500s会触发,这很好。有趣的是,除用户报告外,这是了解错误的最可靠方法。不幸的是,他们没有调用栈...

昨晚,我们在页面中遇到了一个异常,大概是在视图中。正如预期的那样,我们从经典警报中收到了电子邮件,但“失败”部分根本没有显示任何失败。在过去,我们会看到500,但是没有调用栈。似乎除了经典警报和用户以外,其他任何东西都检测不到昨晚的错误。我不知道这是因为昨晚的错误是唯一的,还是我们现在神秘地从Azure中获取了更少的信息。

尝试的解决方案

这些年来,我遵循了无数指南,从翻转门户本身的开关到FTPing和查看原始日志(显然与您的应用程序无关,与Microsoft托管它有关)。如果我每次读一本指南说:“只要单击“例外”选项卡以查看您的调用堆栈”,我都会得到一分钱,我就会很富有:-P。

一个月前,我非常绝望,我在HttpApplication类中为该应用程序实现了Application_Error,并为WebAPI实现了ExceptionLogger,以手动将所有异常记录到文本文件中。不幸的是,虽然这可以帮助我解决一个错误,但随后的异常也没有出现。就像Application Insights一样,大多数访问不存在目录的漫游器也会显示在这些日志中。

一周前,我感到非常绝望,以至于我写了一个简陋的“单元测试”(ha!),将生产数据的副本拉下来并在本地进行了测试,这绝对是骗子。

我已经与其他使用Azure门户改变频率的建筑师级ASP.NET工程师进行了交谈,他们无法提出任何建议。我们看了看web.configs;根目录和Views文件夹中只有一个。我们一直在打开customerrors,但是显然我们不能在生产中运行该错误,因为它会向用户显示错误。话虽如此,我不介意某些用户会看到真正的错误消息。一个人如何做到这一点?如果我猜到了,问题就隐藏在这些web.configs中,仅仅是因为它们很古老并且有很多人碰过它们。

结论

我需要一种100%防弹的方法来从Azure上托管的ASP.NET获取异常及其调用堆栈。否则,几乎不可能解决生产中意外出现的边缘情况。我不记得在Azure之前的日子里这是个问题。

我敢肯定,那里的专家将在短短几分钟内解决此问题,但是,到目前为止,我完全陷入了困境。谢谢您的时间!

1 个答案:

答案 0 :(得分:1)

要尝试检查的几件事:

  1. 确保您的Application Insights NuGet软件包是最新的。在过去的两年中,我已经停止使用指标,或者在我没有收集的AppInsights刀片上显示了新的指标。升级到最新的NuGet软件包就可以了。

  2. 您是否在Web应用程序中捕获异常,然后显式返回HTTP 500响应?如果是这样,您将看不到堆栈跟踪。通过未处理的控制器方法一直冒泡之后,将捕获堆栈跟踪。