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

作者 :斯科特·米切尔

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

简介

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

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

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

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

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

浏览运行状况监视系统的配置

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

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

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

可以在文件夹中的文件%WINDIR%\Microsoft.NET\Framework\version\CONFIG中找到Web.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 运行状况监视事件,并将名称“故障审核”分配给类型的 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 应用程序的基础上自定义。 可以使用元素将<eventMappings><providers>其他元素包含在 和<rules>节中<add>。 若要从默认配置中删除设置,请使用 <remove> 元素,或者用于 <clear /> 从其中一个节中删除所有默认值。 让我们将 Book Reviews Web 应用程序配置为使用 SqlWebEventProvider 类将所有未经处理的异常记录到Microsoft SQL Server 数据库。

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

注意

添加对 ASP 的支持时,该工具aspnet_regsql.exe在“配置使用应用程序服务”教程的网站中进行了讨论。NET 的应用程序服务。 因此,Book Reviews 网站的数据库已包含 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 />元素从和<eventMappings><providers><rules>节擦除预定义的运行状况监视配置信息。 然后,它会向其中每个部分添加一个条目。

  • <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 源查看错误日志。

将事件记录到电子邮件

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

让我们更新书评网站的配置,以便在发生异常时收到电子邮件。 若要完成此操作,需要执行三项任务:

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

运行状况监视系统包括两个电子邮件日志源提供程序类: SimpleMailWebEventProviderTemplatedMailWebEventProvider。 该 SimpleMailWebEventProvider 发送包含事件详细信息的纯文本电子邮件,并提供很少的电子邮件正文自定义。 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> 部分现在包含两个规则。 第一个名为“所有电子邮件错误”的第一个将所有未经处理的异常发送到“EmailWebEventProvider”日志源。 此规则将网站上有关错误的详细信息发送到指定的“地址”的效果。 “所有错误到数据库”规则将错误详细信息记录到站点的数据库。 因此,每当站点上发生未经处理的异常时,其详细信息将记录到数据库并发送到指定的电子邮件地址。

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

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

图 2:在电子邮件中发送错误详细信息
单击可查看全尺寸图像

总结

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

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

快乐编程!

深入阅读

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