3

我目前在一家拥有大量内部定制应用程序的公司工作。目前很多东西都没有标准。我想实现一种方法来记录/跟踪此程序中发生的错误(大多数是 asp.net)。

我目前正在考虑在应用程序错误方法中的 Global.asax 中处理这个问题。首先尝试将信息保存到错误日志/跟踪数据库,如果失败,请尝试发送电子邮件。

从错误消息和其他应用程序变量(页面、用户名等)中获取最有用的信息类型。

我目前正在考虑使用两张表,一张用于获取一般错误和应用程序信息,另一张用于保存异常信息。这将是一对多的关系来处理可能来自一个应用程序级别异常的内部异常。

我确信我遗漏了很多细节,并想听听您处理此问题的策略。

4

10 回答 10

3

我认为ELMAH可能是您正在寻找的。

于 2008-10-26T05:49:30.743 回答
2

如果您使用日志库(如 Log4Net),您可以设置各种日志附加器来记录到电子邮件、数据库、文件、事件日志等,同时在代码中调用单个日志。这篇文章涵盖了您入门所需的一切。

还有ASP.NET 健康监控

编辑:另一张海报提到 ELMAH,它非常适合记录 ASP.NET 错误,并且可以动态“注入”到正在运行的应用程序中。

于 2008-10-26T05:59:27.697 回答
1

Jeff Atwood 写了一个很棒的异常处理程序,你应该在CodeProject上看看

我会尝试收集尽可能多的信息。堆栈信息 会话信息 错误位置

我还将设置应用程序调用的 Web 服务,以将异常信息保存到您的系统中。

于 2008-10-25T19:16:21.083 回答
1

这就是我所做的,但由于电子邮件问题,我仍然遇到了错误。

我从不在数据库上保留任何东西,因为如果数据库有错误,我将永远不会在数据库上出现该错误,从逻辑上讲,插入将失败!

所以我通过电子邮件发送到一个特殊的电子邮件地址,例如 bugs@mydomain.com

主题:[应用程序名称] [时间戳:ddmmyyyy hhmmss] 消息:应用程序、错误消息、堆栈跟踪信息以及会话变量(如用户名)和服务器变量(如引用者)。

ASP.NET 开发人员最好的朋友是堆栈跟踪信息,在这里您会知道出了什么问题、调用了什么以及调用的位置。

您在此系统中遇到的唯一问题是,如果电子邮件有问题(发送电子邮件时出现一些异常),您将不会得到任何东西,为此我开始添加到每月 XML 文件 [errorLog_ mmm_yyyy.xml] 为好吧,并制作了一个简单的“拖放”页面,其中包含一个网格视图,该页面加载了我想要检查错误的月份和年份的 XML。

try 
{
   // production code
}
catch(Exception ex)
{
   Utilities.Mail.SendError(ex);
}

或最好的方法:将其添加到global.asax中的Application_Error中:

<%@ Application Language="C#" %>
<%@ Import Namespace="System.Diagnostics" %>
<script language="C#" runat="server">
void Application_Error(object sender, EventArgs e)
{
   //get reference to the source of the exception chain
   Exception ex = Server.GetLastError().GetBaseException();

   //log the details of the exception and page state to the
   //Windows Event Log
   EventLog.WriteEntry("myWebApplication name",
     "MESSAGE: " + ex.Message + 
     "\nSOURCE: " + ex.Source +
     "\nFORM: " + Request.Form.ToString() + 
     "\nQUERYSTRING: " + Request.QueryString.ToString() +
     "\nTARGETSITE: " + ex.TargetSite +
     "\nSTACKTRACE: " + ex.StackTrace, 
     EventLogEntryType.Error);

   Utilities.Mail.SendError(ex);
}
</script>

使用上面的代码将错误添加到事件日志中,我将错误附加到 SendError(Exception) 函数中的 XML 文件中。

于 2008-10-25T19:36:17.143 回答
1

在记录通过 https 到达的潜在机密信息时要非常小心。用户会期望它被端到端加密(这可能是法律要求)。确保您不通过普通电子邮件发送。

通常我会说记录所有请求,包括获取、发布、cookie、表单状态(在 ASPNET 中)、用户代理、其他标头、日期/时间、服务器机器等

但在某些情况下,这会导致某些您不应该永久记录的信息被记录(例如信用卡号码被传递给支付提供商)。通过电子邮件发送更糟糕。

值得检查 HTTPS 是否打开,如果打开,请减少您记录的信息量以避免此问题。我只是通过一个字符串发送来说明该字段是空的还是非空的。

于 2008-10-26T05:57:17.593 回答
0

听起来您实际上已经很好地考虑了解决方案。

我在 web 开发商店工作,所以除了记录错误之外,我还确保任何系统严重错误(例如失败的数据库查询等)也会通过电子邮件发送,以便我们可以立即处理它们。

可以考虑的一种替代方法是每天通过电子邮件发送一份报告,其中提供有关每个应用程序中引发的每个错误的信息以及您希望在电子邮件中提供的任何相关信息。

我们将所有错误记录到该应用程序的单个表中(当然,当您处理数据库都包含在内部的应用程序时,这更容易做到),包括错误的时间戳和异常消息的全文也已通过电子邮件发送。

异常消息包含函数跟踪,因此您知道原始调用函数是什么以及堆栈中所有函数的文件和行号。这使得回溯任何给定的错误变得超级简单。

于 2008-10-25T19:15:53.347 回答
0

当登录到数据库失败时,您可以写入服务器的事件日志或 Log.txt 文件。您在此处的选择部分取决于您是否有权访问包含这些内容的 Web 服务器。

如果您需要快速响应,发送错误通知电子邮件是一个好主意。但是没有要扫描的错误列表。

为此,我创建了一个特殊的自定义异常类,其属性包括用户信息(ID、名称,如果可用)、所有会话变量、所有表单变量(这样您就可以看到表单是如何填充的以及用户输入的内容) ,以及错误发生位置(哪个页面,哪个类,哪个方法)的堆栈跟踪之外的一些指示。还包括调用的存储过程的名称和发送的参数,或 SQL 本身。还有所有异常属性(堆栈跟踪等)。以及 DisplayMessage 和 InternalMessage 字段。DisplayMessage 显示给用户。InternalMessage 记录在日志中,并在调试模式下显示在自定义错误页面上。

我在基本页面上的 Page_Error 中进行日志记录,并在 Application_Error 中作为故障保护。

有时我会在 web.config 中添加一个键值对来包含我的电子邮件地址(或分发列表)。如果该键中有值,则会发送通知电子邮件。如果没有价值,则不发送电子邮件。然后,在测试或早期生产期间,我可以立即收到有关问题的个人通知。初始阶段过去后,我删除了 web.config 中的电子邮件地址。

于 2008-10-25T19:17:40.457 回答
0

日志记录很好,但应用程序监控更好。

警告:我是 CALM 的作者

于 2008-10-26T05:46:27.537 回答
0

我们对现有的网站错误报告应用程序感到沮丧,因此我们在 Clearwind Consulting 编写了自己的应用程序。它是免费的,我们在内部将其用于我们的项目。它提供完整的错误信息,例如完整的错误代码、浏览器类型、回溯、导致错误的代码片段、30 天以上的错误频率图表等等。在 Clearwind,我们进行 Web 应用程序开发。我们需要一种工具,它可以为我们提供可以有效使用网站的真实数据。

您可以选择如何在您的网站出现错误时获得通知。RSS、电子邮件或任何最适合您的方法都可用于获取错误通知。是的,您可以在喝酒时将错误发送到您的 iPhone。它完全用 Django 编写,因此如果您希望标记或格式化数据,您可以使用 JSON、RoR、XML、CSV 等。或者只是来网站。

如果您愿意,请访问 www.areciboapp.com。

它是免费的,可以轻松添加到任何网站(或从中删除),并提供真实信息以使您能够修复错误,而不仅仅是 404。这里没有硬性销售。只是一个邀请来看看,看看它是否可以帮助你和你的网站。我们认为可能。

于 2009-09-09T01:12:08.287 回答
0

It's a pretty good idea to log to a custom event log on the server as well as any other logging & notification. If the error was caused by an infrastructure issue, the same problem might also keep the error handler from sending emails or saving to a database.

于 2009-09-09T01:25:18.820 回答