你如何记录ASP.NET应用程序中的错误(异常)?

30
我正在寻找在ASP.NET应用程序中记录错误的最佳方法。我希望能够在应用程序中发生错误时接收电子邮件,其中包含有关异常和当前请求的详细信息。
在我们公司,我们曾经拥有自己的ErrorMailer,在Global.asax Application_Error中捕获所有内容。它还可以,但不是非常灵活或可配置。
我们最近切换到了NLog。它更加可配置,我们可以为错误定义不同的目标,过滤它们,缓冲它们(尚未尝试)。这是一个非常好的改进。
但我最近发现,在.Net框架中有一个专门用于此目的的整个名称空间:System.Web.Management,它可以在web.config的healthMonitoring部分中进行配置。
您是否曾经使用过.Net健康监控?您对错误日志记录有什么解决方案?

我也看过System.Web.Management,但从未使用过。我很想听听它是否有效的任何反馈。 - Ben Mills
8个回答

29

我使用 elmah。 它具有一些非常好的功能,这里有一篇关于它的CodeProject文章。 我认为StackOverflow团队也在使用elmah!


7
去年我写了一篇《ELMAH教程》(http://blog.elmah.io/elmah-tutorial/),我认为这篇文章比CodeProject的文章更详细地描述了这种情况。 - ThomasArdal

9
我一直在使用Log4net,配置电子邮件发送致命错误的详细信息。 它还设置了一个日志文件,当尝试调试问题时非常有价值。 另一个好处是,如果标准功能不能满足您的要求,编写自定义appender以按照所需进行处理相对容易。
话虽如此,我与自定义错误处理程序配合使用,该程序发送带有比标准log4net电子邮件更多信息的html电子邮件-页面、会话变量、cookie、http服务器变量等。
这两者都已在Application_OnError事件中连接,其中异常作为log4net中的致命异常记录(然后导致将其发送到指定的电子邮件地址),并且也使用自定义错误处理程序进行处理。
第一次听说Elmah是从Coding Horror博客条目Crash Responsibly中,虽然它看起来很有前途,但我尚未在任何项目中实施它。

2

我使用log4net,每当我 预计 会发生异常时,我会将其记录到相应级别。我通常不会重新抛出异常,因为这不会为用户提供良好的体验,当前状态下可提供的信息较少。

我也配置了Application_Error以捕获任何未预期的异常,并通过log4net将错误记录为Fatal级别(404被检测并记录为Info级别,因为它们不是那么严重)。


2

我一直在使用企业库的日志记录对象。它允许您拥有不同类型的日志记录(平面文件、电子邮件和/或数据库)。它非常可定制化,并且具有一个相当不错的界面,可以更新您的web.config以配置日志记录。通常我会从Global.asax中的On Error调用我的日志记录。

这是MSDN的链接


大约一年前,我被迫在一个项目中使用MS Enterprise Library logging。这非常复杂,我记不清确切的细节,但它缺少了一些在日志记录解决方案中所期望的最基本功能。有一个适用于Visual Studio的插件,是正确设置web.config文件的唯一方法。该工具会重新格式化您的web.config文件并删除其中所有注释 :( - TechSavvySam

0

我们使用EnterpriseLibrary.ExceptionHandling.Logging。我比log4net更喜欢它,因为我们不仅可以完全控制日志记录,还可以在配置中控制Throw/NoThrow决策。


0

我们使用自己编写的定制日志工具。它要求您在需要记录日志的每个地方都要实现日志记录。但是,它也允许您捕获比异常更多的信息。

例如,我们的代码看起来像这样:

Try
  Dim p as New Person()
  p.Name = "Joe"
  p.Age = 30
Catch ex as Exception
  Log.LogException(ex,"Err creating person and assigning name/age")
  Throw ex
End Try

这样,我们的日志记录器将把所有我们需要的信息写入SQL数据库。我们在数据库层面设置了电子邮件警报,以查找某些错误或频繁发生的错误。它能帮助我们准确定位错误来源。

这可能不完全符合您的预期。与使用Global.asax类似的另一种方法是使用代码注入技术,如 AOPPostSharp。这使您能够在每个方法的开头和结尾或在每个异常上注入自定义代码。这是一种有趣的方法,但我认为它可能会产生较大的性能开销。


0

我的团队使用来自Apache的log4net。它非常轻量级且易于设置。最重要的是,它可以完全从web.config文件进行配置,因此一旦您在代码中设置了钩子,只需更改web.config文件即可完全更改日志记录方式。

log4net支持将日志记录到各种位置-数据库、电子邮件、文本文件、Windows事件日志等。我的团队已将其配置为将详细错误信息发送到数据库,并向整个团队发送电子邮件,其中包含足够的信息,以便我们确定错误源代码的哪个部分。然后我们就知道谁负责该代码片段,他们可以去数据库获取更详细的信息。


0

最近我用NLog构建了一个与asp.net相关的webservice,我在所有的桌面应用中都使用它。当我在Visual Studio进行调试时,日志记录工作正常,但是一旦切换到IIS后,日志文件就没有被创建;我还没有确定原因,但是我需要寻找解决方案的事实让我想尝试其他方法来满足我的asp.net需求!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接