提问人:Costo 提问时间:8/15/2008 最后编辑:Mark AmeryCosto 更新时间:10/6/2017 访问量:40894
如何在 ASP.NET 应用程序中记录错误(异常)?
How do you log errors (Exceptions) in your ASP.NET apps?
问:
我正在寻找在 ASP.NET 应用程序中记录错误的最佳方法。 我希望在我的应用程序中发生错误时能够接收电子邮件,其中包含有关异常和当前请求的详细信息。
在我的公司,我们曾经有自己的 ErrorMailer,捕获 Global.asax Application_Error中的所有内容。它是“好的”,但不是很灵活,也不是很可配置。
我们最近切换到了 NLog。它的可配置性要高得多,我们可以为错误定义不同的目标,过滤它们,缓冲它们(尚未尝试)。这是一个非常好的改进。
但是我最近发现,为此目的,.Net框架中有一个完整的命名空间:System.Web.Management,它可以在web.config的healthMonitoring部分进行配置。
您是否曾经使用过 .Net 运行状况监控?您的错误日志记录解决方案是什么?
答:
我们使用我们编写的自定义自开发日志记录工具。它要求您在需要的地方自行实现日志记录。但是,它还允许您捕获更多内容,而不仅仅是异常。
例如,我们的代码如下所示:
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 的方法是一种代码注入技术,例如带有 PostSharp 的 AOP。这允许您在每个方法的开头和结尾或每个异常处注入自定义代码。这是一种有趣的方法,但我相信它可能会产生沉重的性能开销。
我的团队使用 Apache 的 log4net。它非常轻巧且易于设置。最重要的是,它完全可以从 web.config 文件进行配置,因此,一旦在代码设置中获得了挂钩,只需更改 web.config 文件即可完全更改日志记录的完成方式。
log4net 支持记录到各种位置 - 数据库、电子邮件、文本文件、Windows 事件日志等。我的团队将其配置为将详细的错误信息发送到数据库,并向整个团队发送一封电子邮件,其中包含足够的信息,以便我们确定错误源自代码的哪一部分。然后我们知道谁负责那段代码,他们可以去数据库获取更详细的信息。
我用elmah。它有一些非常好的功能,这里有一篇关于它的 CodeProject 文章。我认为 StackOverflow 团队也使用 elmah!
评论
我一直在使用企业库的日志记录对象。它允许您使用不同类型的日志记录(平面文件、电子邮件和/或数据库)。它是非常可定制的,并且有一个非常好的界面,用于更新日志记录配置的 web.config。通常,我从 Global.asax 中的 On Error 调用我的日志记录。
评论
我一直在使用 Log4net,配置为通过电子邮件发送致命错误的详细信息。它还设置为将所有内容记录到日志文件中,这在尝试调试问题时非常宝贵。另一个好处是,如果该标准功能不能执行您想要的操作,那么编写一个自定义 appender 可以根据需要处理日志记录信息是相当容易的。
话虽如此,我将它与自定义错误处理程序结合使用,该处理程序发送一封 html 电子邮件,其中包含比标准 log4net 电子邮件中包含的信息更多的信息 - 页面、会话变量、cookie、http 服务器变量等。
这些都在 Application_OnError 事件中连接起来,其中异常在 log4net 中记录为致命异常(然后导致它通过电子邮件发送到指定的电子邮件地址),并且还使用自定义错误处理程序进行处理。
第一次听说 Elmah 是从 Coding Horror 博客文章 Crash Responsibly 开始的,虽然它看起来很有前途,但我还没有实现它的任何项目。
我最近使用 NLog 构建了一个 asp.net Web 服务,我将其用于我所有的桌面应用程序。当我在 Visual Studio 中调试时,日志记录工作正常,但一旦我切换到 IIS,日志文件就不会创建;我还没有确定原因,但我需要寻找解决方案的事实使我想尝试其他东西来满足我的 asp.net 需求!
我使用 log4net,只要我期望出现异常,我就会将其记录到适当的级别。我倾向于不重新抛出异常,因为它并不能真正提供良好的用户体验,在当前状态下可以提供的信息较少。
我还将Application_Error配置为捕获任何意想不到的异常,并且该错误通过 log4net 记录为致命优先级(好吧,404 被检测并记录为信息,因为它们的严重性并不高)。
我们使用 EnterpriseLibrary.ExceptionHandling.Logging。我比 log4net 更喜欢它,因为我们不仅可以完全控制日志记录,还可以在配置中控制 Throw/NoThrow 决策。
评论