如何在 ASP.NET 应用程序中记录错误(异常)?
-
08-06-2019 - |
题
我正在寻找在 ASP.NET 应用程序中记录错误的最佳方法。我希望能够在应用程序发生错误时收到电子邮件,其中包含有关异常和当前请求的详细信息。
在我的公司,我们曾经有自己的 ErrorMailer,捕获 Global.asax Application_Error 中的所有内容。它是“好的”,但不是很灵活,也不是可配置的。
我们最近切换到 NLog。它的可配置性更高,我们可以为错误定义不同的目标,过滤它们,缓冲它们(尚未尝试)。这是一个非常好的改进。
但我最近发现 .Net 框架中有一个完整的命名空间用于此目的: 系统.Web.管理 并且可以在 健康监测 web.config 部分。
您曾经使用过 .Net 健康监控吗?您的错误记录解决方案是什么?
其他提示
我一直在使用 日志4网, ,配置为通过电子邮件发送致命错误的详细信息。它还设置为将所有内容记录到日志文件中,这在尝试调试问题时非常有用。另一个好处是,如果该标准功能不能满足您的要求,则可以很容易地编写一个自定义附加程序来根据需要处理日志记录信息。
话虽如此,我将其与自定义错误处理程序一起使用,该处理程序会发送一封 html 电子邮件,其中包含的信息比标准 log4net 电子邮件中包含的信息要多一些 - 页面、会话变量、cookie、http 服务器变量等。
这些都连接在 Application_OnError 事件中,其中异常在 log4net 中记录为致命异常(然后导致它通过电子邮件发送到指定的电子邮件地址),并且还使用自定义错误处理程序进行处理。
我一直在使用企业库的日志记录对象。它允许您使用不同类型的日志记录(平面文件、电子邮件和/或数据库)。它是非常可定制的,并且有一个非常好的界面来更新您的 web.config 来配置日志记录。通常我从 Global.asax 中的 On Error 调用我的日志记录。
我使用 log4net,无论我在哪里 预计 异常我将其记录到适当的级别。我倾向于不会重新抛出异常,因为它并不能真正提供良好的用户体验,在当前状态下您可以提供的信息较少。
我还将 Application_Error 配置为捕获任何意外的异常,并通过 log4net 将错误记录为致命优先级(好吧,404 会被检测到并记录为信息,因为它们的严重性不那么高)。
我的团队使用 日志4网 来自阿帕奇。它非常轻巧且易于设置。最重要的是,它完全可以通过 web.config 文件进行配置,因此一旦您在代码设置中获得了钩子,您就可以通过更改 web.config 文件来完全改变日志记录的完成方式。
log4net 支持记录到各种位置 - 数据库、电子邮件、文本文件、Windows 事件日志等。我的团队将其配置为将详细的错误信息发送到数据库,并向整个团队发送一封电子邮件,其中包含足够的信息,以便我们确定错误源自代码的哪一部分。然后我们就知道谁负责那段代码,他们可以去数据库获取更详细的信息。
我最近使用 NLog 构建了一个 asp.net Web 服务,我将其用于所有桌面应用程序。当我在 Visual Studio 中调试时,日志记录工作正常,但是一旦我切换到 IIS,日志文件就不会创建;我还没有确定原因,但事实上我需要寻找解决方案,这让我想尝试其他方法来满足我的 asp.net 需求!
我们使用 EnterpriseLibrary.ExceptionHandling.Logging。我比 log4net 更喜欢它,因为我们不仅可以完全控制日志记录,而且还可以在配置中控制 Throw/NoThrow 决策。
我们使用我们编写的自定义自制日志实用程序。它要求您在需要的地方自行实现日志记录。但是,它还允许您捕获异常以外的更多内容。
例如我们的代码如下所示:
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 类似的另一种方法是使用代码注入技术,例如 奥普 和 后锐利. 。这允许您在每个方法的开头和结尾或每个异常上注入自定义代码。这是一种有趣的方法,但我相信它可能会带来沉重的性能开销。