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

How do you log errors (Exceptions) in your ASP.NET apps?

提问人:Costo 提问时间:8/15/2008 最后编辑:Mark AmeryCosto 更新时间:10/6/2017 访问量:40894

问:

我正在寻找在 ASP.NET 应用程序中记录错误的最佳方法。 我希望在我的应用程序中发生错误时能够接收电子邮件,其中包含有关异常和当前请求的详细信息。

在我的公司,我们曾经有自己的 ErrorMailer,捕获 Global.asax Application_Error中的所有内容。它是“好的”,但不是很灵活,也不是很可配置。

我们最近切换到了 NLog。它的可配置性要高得多,我们可以为错误定义不同的目标,过滤它们,缓冲它们(尚未尝试)。这是一个非常好的改进。

但是我最近发现,为此目的,.Net框架中有一个完整的命名空间:System.Web.Management,它可以在web.confighealthMonitoring部分进行配置。

您是否曾经使用过 .Net 运行状况监控?您的错误日志记录解决方案是什么?

asp.net 错误处理 nlog 运行状况监控

评论

0赞 Ben Mills 12/5/2008
我也见过System.Web.Management,但我从未使用过它。我很想听听关于它是否运行良好的任何反馈。

答:

0赞 brendan 8/15/2008 #1

我们使用我们编写的自定义自开发日志记录工具。它要求您在需要的地方自行实现日志记录。但是,它还允许您捕获更多内容,而不仅仅是异常。

例如,我们的代码如下所示:

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 的方法是一种代码注入技术,例如带有 PostSharpAOP。这允许您在每个方法的开头和结尾或每个异常处注入自定义代码。这是一种有趣的方法,但我相信它可能会产生沉重的性能开销。

0赞 Brandon Wood 8/15/2008 #2

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

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

29赞 Dale Ragan 8/15/2008 #3

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

评论

7赞 ThomasArdal 9/28/2014
我去年写了一个 ELMAH 教程,我认为它比 CodeProject 文章更详细地描述了这种情况。
2赞 Brian Childress 8/15/2008 #4

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

下面是指向 MSDN 的链接

评论

0赞 TechSavvySam 9/8/2017
大约一年前,我被迫将 MS Enterprise Library 日志记录用于一个项目。它非常复杂,我不记得确切的细节,但它缺少一些人们在日志记录解决方案中期望的最小功能。有一个适用于 Visual Studio 的加载项,它是正确设置 web.config 的唯一方法。该工具会重新格式化 web.config 并删除其中的所有注释:(
9赞 Mun 8/15/2008 #5

我一直在使用 Log4net,配置为通过电子邮件发送致命错误的详细信息。它还设置为将所有内容记录到日志文件中,这在尝试调试问题时非常宝贵。另一个好处是,如果该标准功能不能执行您想要的操作,那么编写一个自定义 appender 可以根据需要处理日志记录信息是相当容易的。

话虽如此,我将它与自定义错误处理程序结合使用,该处理程序发送一封 html 电子邮件,其中包含比标准 log4net 电子邮件中包含的信息更多的信息 - 页面、会话变量、cookie、http 服务器变量等。

这些都在 Application_OnError 事件中连接起来,其中异常在 log4net 中记录为致命异常(然后导致它通过电子邮件发送到指定的电子邮件地址),并且还使用自定义错误处理程序进行处理。

第一次听说 Elmah 是从 Coding Horror 博客文章 Crash Responsibly 开始的,虽然它看起来很有前途,但我还没有实现它的任何项目。

0赞 jburka 9/16/2008 #6

我最近使用 NLog 构建了一个 asp.net Web 服务,我将其用于我所有的桌面应用程序。当我在 Visual Studio 中调试时,日志记录工作正常,但一旦我切换到 IIS,日志文件就不会创建;我还没有确定原因,但我需要寻找解决方案的事实使我想尝试其他东西来满足我的 asp.net 需求!

2赞 Aaron Powell 1/23/2009 #7

我使用 log4net,只要我期望出现异常,我就会将其记录到适当的级别。我倾向于不重新抛出异常,因为它并不能真正提供良好的用户体验,在当前状态下可以提供的信息较少。

我还将Application_Error配置为捕获任何意想不到的异常,并且该错误通过 log4net 记录为致命优先级(好吧,404 被检测并记录为信息,因为它们的严重性并不高)。

0赞 matt-dot-net 8/10/2015 #8

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