如何在ASP.NET应用程序中记录错误(异常)?
我正在寻找在ASP.NET应用程序中记录错误的最佳方法。
我希望当我的应用程序发生错误时能够接收电子邮件,其中包含有关Exception和当前Request的详细信息。
在我的公司中,我们曾经拥有自己的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!
回答
我一直在使用企业库的Logging对象。它允许我们进行不同类型的日志记录(平面文件,电子邮件和/或者数据库)。它是非常可定制的,并且具有用于更新日志配置的web.config的良好界面。通常,我从Global.asax中的On Error调用日志记录。
这是MSDN的链接
回答
我一直在使用Log4net,配置为通过电子邮件发送致命错误的详细信息。它还设置为将所有内容记录到日志文件,这在尝试调试问题时非常宝贵。另一个好处是,如果该标准功能无法实现我们想要的功能,那么编写自定义的添加程序就很容易了,该添加程序可以根据需要处理日志信息。
话虽如此,我与自定义错误处理程序配合使用,该错误处理程序发送的html电子邮件包含比标准log4net电子邮件页面,会话变量,cookie,http服务器变量等更多的信息。
这些都在Application_OnError事件中连接在一起,在该事件中,该异常作为致命异常记录在log4net中(然后将其通过电子邮件发送到指定的电子邮件地址),并使用自定义错误处理程序进行处理。
最初是从Coding Horror博客条目"负责任崩溃"中得知Elmah的,尽管看起来很有希望,但我尚未在任何项目中实施它。
回答
我最近用NLog构建了一个asp.net Web服务,我将其用于所有桌面应用程序。在Visual Studio中调试时,日志记录工作正常,但是,一旦切换到IIS,就不会创建日志文件。我尚未确定原因,但事实上,我需要寻找解决方案,这使得我想尝试其他一些适合asp.net的需求!
回答
我使用log4net,在任何我希望发生异常的地方,都将其记录到适当的级别。我倾向于不抛出异常,因为它实际上并不能提供很好的用户体验,在当前状态下我们可以提供的信息较少。
我还将Application_Error也配置为捕获所有未预期到的异常,并且该错误通过log4net作为致命优先级记录下来(好吧,由于它们的严重性不是很高,因此检测到404并将其记录为Info)。