2008-10-25 63 views
3

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

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

什么类型的信息是最有用的错误消息和其他应用程序变量(页,用户名等)来获得。

我目前想用两个表,一个得到普遍的错误和应用信息的,以及第二保存异常信息。这将是一对多关系来处理可能来自一个应用程序级别异常的内部异常。

我相信,我错过了很多细节,并想听听处理此问题的策略。

回答

1

杰夫阿特伍德写了一个伟大的异常处理程序,你应该看看上CodeProject

我会试图收集尽可能多的信息成为可能。 堆栈信息 会话信息 定位误差

的我也要建立一个Web服务的应用程序调用的异常信息保存关闭到系统中。

0

它实际上听起来像你认为解决方案很好。

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

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

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

异常消息包含一个函数跟踪,让你知道什么原始调用函数是以及文件和行号的堆栈中的所有功能。这使得反馈任何给定的错误都非常简单。

+0

保存所有数据库的问题是,如果错误是在数据库本身,您永远不会在日常报告中得到错误,导致系统无法插入它! :-) – balexandre 2008-10-25 19:27:02

0

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

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

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

我在基页的Page_Error中进行日志记录,并在Application_Error中执行失效保护。

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

1

这就是我所做的,并且由于电子邮件问题,我仍然有一个错误。

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

因此,我通过电子邮件发送给像[email protected]

主题一个特殊的电子邮件地址:[应用程序名称] [时间戳:DDMMYYYY HHMMSS] 消息:应用程序,错误消息,堆栈跟踪信息加上会话变量,如用户名和服务器变量,如推荐人。

ASP.NET开发人员的最好的朋友是堆栈跟踪信息,正是在这里,你会知道哪里出了问题,什么是呼叫,它被调用。

您在本系统有唯一的问题,是你不会得到任何东西,如果电子邮件有问题(一些例外,在发送电子邮件时),为此,我开始添加到每月的XML文件[ errorLog_mmm_yyyy.xml],并使用gridview加载了一个简单的“拖放”页面,该页面加载了我想要检查错误的月份和年份的XML。

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

或最好的办法:将它添加到的Application_Error在Global.asax中:与代码

<%@ 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文件。

+0

这很好,假设你有权访问服务器上的事件日志,并且实际上记得定期查看它;-) – 2008-10-26 15:04:07

3

的作者,我认为ELMAH可能是你在找什么。

1

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

一般情况下我说的所有记录,包括GET,POST,饼干,形式状态(ASPNET),用户代理,其他标题,日期/时间,服务器计算机等要求的

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

如果HTTPS处于打开状态,则值得检查,如果是这样,请减少记录的信息量以避免此问题。我只是通过一个字符串来表示该字段是空的还是非空的。

2

如果您使用日志库(如Log4Net),则可以设置各种日志appender,以在代码中进行单个日志调用时登录到电子邮件,数据库,文件,事件日志等。这post涵盖了你需要开始的一切。

还有ASP.NET health monitoring

编辑:另一张海报提到ELMAH,这是伟大的录制ASP.NET错误,并可以动态'注入'运行的应用程序。

0

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

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

如果你喜欢,请看www.areciboapp.com。

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

0

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