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

时间:2008-08-15 04:05:11

标签: asp.net error-handling nlog health-monitoring

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

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

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

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

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

8 个答案:

答案 0 :(得分:29)

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

答案 1 :(得分:9)

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

话虽如此,我正在使用它与自定义错误处理程序一起发送一个html电子邮件,其中包含的信息比标准log4net电子邮件中包含的信息要多 - 页面,会话变量,cookie,http服务器变量,等

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

首先从Coding Horror博客文章Elmah中听说Crash Responsibly,虽然看起来很有希望但我还没有实施任何项目。

答案 2 :(得分:2)

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

Here's a link to the MSDN

答案 3 :(得分:2)

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

我还将Application_Error配置为捕获任何不期望的异常,并通过log4net将错误记录为致命优先级(好吧,404检测到并记录为Info,因为它们不是那么高的严重性)。 / p>

答案 4 :(得分: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之类的代码注入技术。这允许您在每个方法的开头和结尾或每个异常处注入自定义代码。这是一种有趣的方法,但我相信它可能会带来很大的性能开销。

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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