ASP.NET 运行状况监视的日志记录错误详细信息 (C#)

作者 :Scott Mitchell

Microsoft 的运行状况监视系统提供了一种简单且可自定义的方式来记录各种 Web 事件,包括未经处理的异常。 本教程逐步讲解如何设置运行状况监视系统,以将未经处理的异常记录到数据库,并通过电子邮件通知开发人员。

简介

日志记录是监视已部署应用程序的运行状况和诊断可能出现的任何问题的有用工具。 记录在已部署的应用程序中发生的错误尤其重要,以便可以纠正这些错误。 Error每当 ASP.NET 应用程序中发生未经处理的异常时,将引发 事件;前面的教程介绍了如何通过为Error事件创建事件处理程序来通知开发人员错误并记录其详细信息。 但是,创建事件处理程序 Error 来记录错误的详细信息并通知开发人员是不必要的,因为 ASP 可以执行此任务。NET 的 运行状况监视系统

运行状况监视系统是在 ASP.NET 2.0 中引入的,旨在通过记录应用程序或请求生存期内发生的事件来监视已部署 ASP.NET 应用程序的运行状况。 运行状况监视系统记录的事件称为 运行状况监视事件Web 事件,包括:

  • 应用程序生存期事件,例如应用程序启动或停止时间
  • 安全事件,包括失败的登录尝试和失败的 URL 授权请求
  • 应用程序错误,包括未经处理的异常、视图状态分析异常、请求验证异常和编译错误,以及其他类型的错误。

引发运行状况监视事件时,可以将其记录到任意数量的指定 日志源。 运行状况监视系统随附日志源,这些日志源将 Web 事件记录到 Microsoft SQL Server 数据库、Windows 事件日志或通过电子邮件消息等。 还可以创建自己的日志源。

运行状况监视系统记录的事件以及使用的日志源在 中 Web.config定义。 通过几行配置标记,可以使用运行状况监视将所有未经处理的异常记录到数据库中,并通过电子邮件通知异常。

探索运行状况监视系统的配置

运行状况监视系统的行为由其配置信息定义,该信息位于 中的 元素中<healthMonitoring>Web.config。 除其他事项外,此配置部分定义了以下三条重要信息:

  1. 引发时应记录的运行状况监视事件,
  2. 日志源和
  3. (1) 中定义的每个运行状况监视事件如何映射到 (2) 中定义的日志源。

此信息分别通过三个子配置元素指定: <eventMappings><providers><rules>

可以在 文件夹中的 Web.config 文件 %WINDIR%\Microsoft.NET\Framework\version\CONFIG 中找到默认的运行状况监视系统配置信息。 为简洁起见,此默认配置信息删除了一些标记,如下所示:

<configuration>
  <system.web>
  <healthMonitoring>
  <eventMappings>
  <add name="All Errors" type="System.Web.Management.WebBaseErrorEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>

  <add name="Failure Audits" type="System.Web.Management.WebFailureAuditEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
  </eventMappings>

  <providers>
  <add name="EventLogProvider" type="System.Web.Management.EventLogWebEventProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>

  <add connectionStringName="LocalSqlServer" maxEventDetailsLength="1073741823" buffer="false" bufferMode="Notification" name="SqlWebEventProvider" type="System.Web.Management.SqlWebEventProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>
  </providers>

  <rules>
  <add name="All Errors Default" eventName="All Errors" provider="EventLogProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom=""/>

  <add name="Failure Audits Default" eventName="Failure Audits" provider="EventLogProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom=""/>
  </rules>
  </healthMonitoring>
  </system.web>
</configuration>

相关的运行状况监视事件在 元素中 <eventMappings> 定义,该元素为一类运行状况监视事件提供一个用户友好名称。 在上面的标记中 <eventMappings> , 元素将人类友好名称“所有错误”分配给类型的 WebBaseErrorEvent 运行状况监视事件,并将名称“Failure Audits”分配给类型的 WebFailureAuditEvent运行状况监视事件。

<providers>元素定义日志源,为其提供一个用户友好的名称,并指定任何特定于日志源的配置信息。 第一个 <add> 元素定义“EventLogProvider”提供程序,该提供程序使用 EventLogWebEventProvider 类记录指定的运行状况监视事件。 类 EventLogWebEventProvider 将事件记录到 Windows 事件日志中。 第二<add>个元素定义“SqlWebEventProvider”提供程序,该提供程序通过 SqlWebEventProvider 类将事件记录到 Microsoft SQL Server 数据库。 “SqlWebEventProvider”配置指定数据库的连接字符串 (connectionStringName) 以及其他配置选项。

元素 <rules> 将 元素中指定的 <eventMappings> 事件映射到 元素中的 <providers> 记录源。 默认情况下,ASP.NET Web 应用程序会将所有未经处理的异常和审核失败记录到 Windows 事件日志中。

将事件记录到数据库

通过将 部分添加到<healthMonitoring>Web.config应用程序的 文件中,可以在 Web 应用程序的基础上自定义运行状况监视系统的默认配置。 可以使用 <add> 元素在 <eventMappings><providers><rules> 节中包含其他元素。 若要从默认配置中删除设置, <remove> 请使用 元素,或使用 <clear /> 从这些部分之一中删除所有默认值。 让我们配置 Book Reviews Web 应用程序,以使用 SqlWebEventProvider 类将所有未经处理的异常记录到 Microsoft SQL Server 数据库。

SqlWebEventProvider是运行状况监视系统的一部分,并将运行状况监视事件记录到指定的SQL Server数据库。 类 SqlWebEventProvider 要求指定的数据库包含名为 的 aspnet_WebEvent_LogEvent存储过程。 此存储过程传递事件的详细信息,并负责存储事件详细信息。 好消息是,无需创建此存储过程或表来存储事件详细信息。 可以使用 工具将这些对象添加到数据库 aspnet_regsql.exe

注意

aspnet_regsql.exe添加对 ASP 的支持时,在配置使用应用程序服务的网站教程中讨论了该工具。NET 的应用程序服务。 因此,书评网站的数据库已包含 aspnet_WebEvent_LogEvent 存储过程,该过程将事件信息存储在名为 的 aspnet_WebEvent_Events表中。

将必要的存储过程和表添加到数据库后,剩下的就是指示运行状况监视将所有未经处理的异常记录到数据库中。 为此,请将以下标记添加到网站的 Web.config 文件中:

<configuration>
  ...
  <system.web>
  ...
  <healthMonitoring enabled="true">
  <eventMappings>
  <clear />

  <add name="All Errors" type="System.Web.Management.WebBaseErrorEvent"
  startEventCode="0" endEventCode="2147483647" />
  </eventMappings>

  <providers>
  <clear />

  <add connectionStringName="ReviewsConnectionString" maxEventDetailsLength="1073741823"
  buffer="false" name="SqlWebEventProvider"
  type="System.Web.Management.SqlWebEventProvider" />
  </providers>

  <rules>
  <clear />

  <add name="All Errors Default" eventName="All Errors" provider="SqlWebEventProvider"
  profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />
  </rules>
  </healthMonitoring>
  </system.web>
</configuration>

上述运行状况监视配置标记使用 <clear /> 元素擦除 、 <providers><rules> 部分中预定义的<eventMappings>运行状况监视配置信息。 然后,它会向其中每个部分添加一个条目。

  • 元素 <eventMappings> 定义名为“所有错误”的单个相关运行状况监视事件,每当发生未经处理的异常时,都会引发该事件。
  • 元素 <providers> 定义一个名为“SqlWebEventProvider”的日志源,该日志源使用 SqlWebEventProvider 类。 属性 connectionStringName 已设置为“ReviewsConnectionString”,这是节中 <connectionStrings> 定义的连接字符串的名称。
  • 最后, <rules> 元素指示当“所有错误”事件发生时,应使用“SqlWebEventProvider”提供程序记录该事件。

此配置信息指示运行状况监视系统将所有未经处理的异常记录到 Book Reviews 数据库。

注意

WebBaseErrorEvent 针对服务器错误引发 事件;不会针对 HTTP 错误引发该事件,例如对找不到 ASP.NET 资源的请求。 这不同于类的 Error 事件的行为HttpApplication,该事件同时针对服务器和 HTTP 错误引发。

若要查看运行状况监视系统的运行情况,请访问网站并通过访问 Genre.aspx?ID=foo生成运行时错误。 应看到相应的错误页 - 访问本地) 时 (的异常详细信息黄屏,或者在访问生产) 中的站点时 (自定义错误页。 在后台,运行状况监视系统将错误信息记录到数据库。 表中应有一条记录 aspnet_WebEvent_Events (见 图 1) ;此记录包含有关刚刚发生的运行时错误的信息。

显示记录到表中的错误详细信息的屏幕截图。

图 1:错误详细信息记录到 aspnet_WebEvent_Events 表中
(单击以查看全尺寸图像)

在网页中显示错误日志

使用网站的当前配置,运行状况监视系统将所有未经处理的异常记录到数据库中。 但是,运行状况监视不提供任何机制来通过网页查看错误日志。 但是,可以生成一个 ASP.NET 页,用于显示数据库中的此信息。 (正如我们稍后看到的,你可以选择在电子邮件中向你发送错误详细信息。)

如果创建此类页面,请确保采取措施,仅允许授权用户查看错误详细信息。 如果站点已使用用户帐户,则可以使用 URL 授权规则将页面的访问权限限制为某些用户或角色。 有关如何基于登录用户授予或限制对网页的访问权限的详细信息,请参阅我的 网站安全教程

注意

后续教程探讨名为 ELMAH 的替代错误日志记录和通知系统。 ELMAH 包含一个内置机制,用于从网页和 RSS 源查看错误日志。

将事件记录到Email

运行状况监视系统包括一个日志源提供程序,该提供程序将事件“记录”到电子邮件中。 日志源包含在电子邮件正文中记录到数据库中的相同信息。 可以使用此日志源在发生特定运行状况监视事件时通知开发人员。

让我们更新 Book Reviews 网站的配置,以便在发生异常时收到电子邮件。 为此,需要执行三项任务:

  1. 将 ASP.NET Web 应用程序配置为发送电子邮件。 这是通过指定如何通过 配置元素发送电子邮件来实现的 <system.net> 。 有关在 ASP.NET 应用程序中发送电子邮件的详细信息,请参阅在 ASP.NET 中发送EmailSystem.Net.Mail 常见问题解答
  2. 在 元素中 <providers> 注册电子邮件日志源提供程序,
  3. 向 元素添加一个条目, <rules> 用于将“所有错误”事件映射到步骤 2) 中添加的日志源提供程序 (。

运行状况监视系统包括两个电子邮件日志源提供程序类: SimpleMailWebEventProviderTemplatedMailWebEventProviderSimpleMailWebEventProvider发送一封包含事件详细信息的纯文本电子邮件,并且很少提供电子邮件正文的自定义。 TemplatedMailWebEventProvider使用 类,可以指定一个 ASP.NET 页面,其呈现的标记用作电子邮件的正文。 TemplatedMailWebEventProvider使你能够更好地控制电子邮件的内容和格式,但需要多一些前期工作,因为必须创建生成电子邮件正文的 ASP.NET 页面。 本教程重点介绍如何使用 SimpleMailWebEventProvider 类。

更新 文件中运行状况 <providers> 监视系统的 元素, Web.config 以包含 类的 SimpleMailWebEventProvider 日志源:

<providers>
  <clear />

  <add type="System.Web.Management.SimpleMailWebEventProvider"
  name="EmailWebEventProvider" buffer="false"
  from="support@example.com" to="support@example.com"
  subjectPrefix="Book Reviews Runtime Error: " />
  
  <add connectionStringName="ReviewsConnectionString" maxEventDetailsLength="1073741823"
  buffer="false" name="SqlWebEventProvider"
  type="System.Web.Management.SqlWebEventProvider" />
</providers>

上述标记使用 SimpleMailWebEventProvider 类作为日志源提供程序,并为其分配友好名称“EmailWebEventProvider”。 此外, <add> 属性包括其他配置选项,例如电子邮件的“到”和“发件人”地址。

定义电子邮件日志源后,剩下的就是指示运行状况监视系统使用此源来“记录”未经处理的异常。 这可以通过在 <rules> 部分添加新规则来实现:

<rules>
  <clear />

  <add name="All Errors To Email" eventName="All Errors" provider="EmailWebEventProvider"
  profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />

  <add name="All Errors To Database" eventName="All Errors" provider="SqlWebEventProvider"
  profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />
</rules>

<rules> 部分现在包含两个规则。 第一个名为“所有错误Email”,将所有未经处理的异常发送到“EmailWebEventProvider”日志源。 此规则的作用是将网站上有关错误的详细信息发送到指定的“To”地址。 “数据库的所有错误”规则会将错误详细信息记录到站点的数据库。 因此,每当站点上发生未经处理的异常时,其详细信息都会记录到数据库并发送到指定的电子邮件地址。

图 2 显示了访问 Genre.aspx?ID=foo时类SimpleMailWebEventProvider生成的电子邮件。

显示电子邮件中发送的错误详细信息的屏幕截图。

图 2:错误详细信息在Email消息中发送
(单击以查看全尺寸图像)

总结

ASP.NET 运行状况监视系统旨在允许管理员监视已部署的 Web 应用程序的运行状况。 当某些操作展开时,例如应用程序停止、用户成功登录到站点或发生未经处理的异常时,将引发运行状况监视事件。 这些事件可以记录到任意数量的日志源。 本教程演示如何将未经处理的异常的详细信息记录到数据库和通过电子邮件。

本教程重点介绍如何使用运行状况监视来记录未经处理的异常,但请记住,运行状况监视旨在测量已部署的 ASP.NET 应用程序的整体运行状况,并包含大量此处未探讨的运行状况监视事件和日志源。 更重要的是,如果需要,可以创建自己的运行状况监视事件和日志源。 如果有兴趣了解有关运行状况监视的详细信息,最好先阅读 Erik Reitan运行状况监视常见问题解答。 接下来,请参阅 如何:在 ASP.NET 2.0 中使用运行状况监视

编程愉快!

深入阅读

有关本教程中讨论的主题的详细信息,请参阅以下资源: