实时/生产Web应用程序中的错误跟踪

时间:2008-10-25 19:05:31

标签: asp.net error-logging

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

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

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

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

我确信我错过了很多细节,并希望听到您处理此问题的策略。

10 个答案:

答案 0 :(得分:3)

我认为ELMAH可能就是你要找的东西。

答案 1 :(得分:2)

如果使用日志库(如Log4Net),您可以设置各种日志记录程序,以便在代码中进行单个日志调用时记录到电子邮件,数据库,文件,事件日志等。这个post涵盖了您入门所需的一切。

还有ASP.NET health monitoring

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

答案 2 :(得分:1)

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

上看一下

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

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

答案 3 :(得分:1)

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

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

所以我发邮件到bugs@mydomain.com等特殊电子邮件地址

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

ASP.NET开发人员最好的朋友 堆栈跟踪信息,在这里你会知道出了什么问题,电话是什么以及它在哪里正在打电话。

你在这个系统中遇到的唯一问题是,如果电子邮件有问题(发送电子邮件时有一些例外),你将无法得到任何东西,为此我开始添加到每月XML文件[errorLog_mmm_yyyy.xml]也做了一个简单的“拖放”页面,其中包含一个gridview,它加载了我想检查错误的月份和年份的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文件中。

答案 4 :(得分:1)

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

通常我会说记录所有请求,包括get,post,cookies,表单状态(在ASPNET中),用户代理,其他标题,日期/时间,服务器机器等

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

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

答案 5 :(得分:0)

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

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

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

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

异常消息包含一个函数跟踪,因此您可以知道原始调用函数的内容以及堆栈中所有函数的文件和行号。这使得对任何给定bug的回溯非常简单。

答案 6 :(得分:0)

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

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

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

我在基页上记录Page_Error,在Application_Error中记录故障保护。

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

答案 7 :(得分:0)

日志记录很好,但application monitoring更好。

警告:我是CALM的作者

答案 8 :(得分:0)

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

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

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

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

答案 9 :(得分:0)

最好记录服务器上的自定义事件日志以及任何其他日志记录&amp;通知。如果错误是由基础结构问题引起的,同样的问题也可能使错误处理程序无法发送电子邮件或保存到数据库。