29

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

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

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

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

您曾经使用过 .Net 健康监控吗?您的错误记录解决方案是什么?

4

8 回答 8

30

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

于 2008-08-15T04:34:49.817 回答
9

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

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

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

第一次听说Elmah是从 Coding Horror 博客条目Crash Responsibly中得知的,虽然它看起来很有希望,但我还没有在任何项目中实现它。

于 2008-08-15T06:31:07.070 回答
2

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

这是 MSDN 的链接

于 2008-08-15T06:11:57.937 回答
2

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

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

于 2009-01-23T09:56:20.210 回答
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 类似的另一种方法是使用代码注入技术,例如带有PostSharp的AOP。这允许您在每个方法的开头和结尾或每个异常处注入自定义代码。这是一种有趣的方法,但我相信它可能会产生很大的性能开销。

于 2008-08-15T04:26:53.653 回答
0

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

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

于 2008-08-15T04:33:02.613 回答
0

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

于 2008-09-15T17:22:49.150 回答
0

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

于 2015-08-09T16:52:46.750 回答