https://docs.microsoft.com/zh-cn/aspnet/web-forms/overview/older-versions-getting-started/deploying-web-site-projects/logging-error-details-with-asp-net-health-monitoring-cs
ASP.NET 运行状况监视的日志记录错误详细信息 (C#)
Microsoft 的运行状况监视系统提供了一种简单且可自定义的方式来记录各种 Web 事件,包括未经处理异常。 本教程逐步介绍如何设置运行状况监视系统,以将未经处理异常记录到数据库,并通过电子邮件通知开发人员。
简介
日志记录是监视已部署应用程序的运行状况和诊断可能出现的任何问题的有用工具。 记录在已部署应用程序中发生的错误,以便可以修正这些错误尤为重要。 每当 ASP.NET Error
应用程序中发生未经处理异常时,就会引发 事件;前面的教程演示了如何通过为事件创建事件处理程序来通知开发人员错误并记录其详细信息。Error
但是,无需Error
创建事件处理程序来记录错误的详细信息并通知开发人员,因为此任务 ASP.NET 运行状况 监视系统执行。
运行状况监视系统是在 ASP.NET 2.0 中引入的,旨在通过记录应用程序或请求生存期内发生的事件来监视已部署的 ASP.NET 应用程序的运行状况。 运行状况监视系统记录的事件称为运行状况监视事件或 Web 事件,包括:
- 应用程序生存期事件,例如应用程序何时启动或停止
- 安全事件,包括失败的登录尝试和失败的 URL 授权请求
- 应用程序错误,包括未经处理异常、查看状态分析异常、请求验证异常和编译错误以及其他类型的错误。
引发运行状况监视事件时,可以记录到任意数目的指定 日志源。 运行状况监视系统附带日志源,这些日志源将 Web 事件记录到 Microsoft SQL Server 数据库、Windows事件日志或通过电子邮件等方式记录 Web 事件。 还可以创建自己的日志源。
运行状况监视系统日志以及使用的日志源的事件在 中定义 Web.config
。 只需几行配置标记,就可以使用运行状况监视将所有未经处理异常记录到数据库,并通过电子邮件通知你异常。
浏览运行状况监视系统的配置
运行状况监视系统的行为由位于 中的 元素中的配置<healthMonitoring>
信息定义Web.config
。 此配置部分定义了以下三条重要信息:
- 引发时应记录的运行状况监视事件,
- 日志源, 和
- 第 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
错误"分配给 类型的运行状况监视事件,将名称"失败审核"分配给 类型的运行状况监视事件 WebFailureAuditEvent
。
元素 <providers>
定义日志源,为它们指定一个友好名称,并指定任何特定于日志源的配置信息。 第一 <add>
个元素定义"EventLogProvider"提供程序,该提供程序使用 类记录指定的运行状况监视 EventLogWebEventProvider
事件。 类EventLogWebEventProvider
将事件记录到事件Windows日志。 第二<add>
个元素定义"SqlWebEventProvider"提供程序,该提供程序通过 Microsoft SQL Server数据库记录SqlWebEventProvider
事件。 "SqlWebEventProvider connectionStringName
"配置指定数据库的连接字符串 () 配置选项之一。
元素 <rules>
将 元素中指定的事件 <eventMappings>
映射到 元素中的日志 <providers>
源。 默认情况下,ASP.NET Web 应用程序将所有未处理异常和审核失败记录到Windows日志。
将事件记录到数据库
运行状况监视系统的默认配置 <healthMonitoring>
可以通过向应用程序的 文件添加 部分,基于 Web 应用程序(按 Web 应用程序)进行 Web.config
自定义。 可以使用 元素在 <eventMappings>
、 <providers>
和 <rules>
节中包括其他 <add>
元素。 若要从默认配置中删除设置,请使用 <remove>
元素,或使用 <clear />
从这些部分之一中删除所有默认值。 让我们配置 Book Reviews Web 应用程序,以使用 类将所有未处理Microsoft SQL Server记录到数据库SqlWebEventProvider
。
类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 />
元素<eventMappings>``<providers>
擦除 、 和 节中预定义的运行状况监视配置<rules>
信息。 然后,它会向其中每个部分添加一个条目。
- 元素
<eventMappings>
定义名为"所有错误"的单个运行状况监视事件,每当发生未经处理异常时,将引发该事件。 - 元素
<providers>
定义使用 类的名为"SqlWebEventProvider"的单个日志SqlWebEventProvider
源。 属性connectionStringName
已设置为"ReviewsConnectionString",这是在 节中定义的连接字符串<connectionStrings>
的名称。 - 最后, <rules> 元素指示当"所有错误"事件出现时,应该使用"SqlWebEventProvider"提供程序记录该事件。
此配置信息指示运行状况监视系统将所有未经处理异常记录到 Book Reviews 数据库。
备注
仅WebBaseErrorEvent
针对服务器错误引发 事件;对于 HTTP 错误(例如,对找不到 ASP.NET 资源的请求)不会引发该事件。 这与 类的 事件HttpApplication``Error
的行为不同,该事件针对服务器和 HTTP 错误引发。
若要了解运行状况监视系统的运行情况,请访问网站,并访问 生成运行时错误 Genre.aspx?ID=foo
。 在生产环境中访问站点时,应会看到相应的错误页 - 访问本地) 时出现异常详细信息黄色屏幕 (或自定义错误页 () 。 运行状况监视系统在后台将错误信息记录到数据库。 表中应该有一条记录 aspnet_WebEvent_Events
(图 1) ;此记录包含有关刚发生的运行时错误的信息。
图 1:错误详细信息已记录到 aspnet_WebEvent_Events
表中
(单击以查看完整大小)
在网页中显示错误日志
使用网站的当前配置,运行状况监视系统将所有未经处理异常记录到数据库。 但是,运行状况监视不提供通过网页查看错误日志的任何机制。 但是,可以生成一 ASP.NET 页,用于显示数据库中的此信息。 (我们将暂时看到,可以选择在电子邮件中将错误详细信息发送给你。)
如果创建此类页面,请确保执行仅允许授权用户查看错误详细信息的步骤。 如果站点已使用用户帐户,可以使用 URL 授权规则将页面访问权限限制为特定用户或角色。 若要详细了解如何基于登录用户授予或限制对网页的访问,请参阅网站 安全教程。
备注
后续教程将探讨名为 ELMAH 的替代错误日志记录和通知系统。 ELMAH 包括一种内置机制,用于从网页和 RSS 源查看错误日志。
将事件记录到电子邮件
运行状况监视系统包括日志源提供程序,该提供程序将事件"记录"到电子邮件中。 日志源包含记录到电子邮件正文中的数据库的相同信息。 当发生特定运行状况监视事件时,可以使用此日志源通知开发人员。
让我们更新书籍评论网站的配置,以便每当发生异常时,我们都会收到一封电子邮件。 为此,我们需要执行三项任务:
- 配置 ASP.NET Web 应用程序以发送电子邮件。 这是通过指定通过配置元素发送电子邮件方式完成的
<system.net>
。 有关在应用程序内发送电子邮件 ASP.NET 请参阅在 ASP.NET 和 System.Net.Mail 常见问题解答。 - 在 元素中注册电子邮件日志源提供程序
<providers>
, - 向 元素添加
<rules>
一个条目,该元素将"所有错误"事件映射到步骤 2 (中添加的日志) 。
运行状况监视系统包括两个电子邮件日志源提供程序类: 和 SimpleMailWebEventProvider
TemplatedMailWebEventProvider
。 类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 显示访问 时 类 SimpleMailWebEventProvider
生成的电子邮件 Genre.aspx?ID=foo
。
图 2:错误详细信息在电子邮件中发送
(单击以查看完整大小)
总结
ASP.NET 运行状况监视系统旨在允许管理员监视已部署的 Web 应用程序的运行状况。 当某些操作展开时(例如,当应用程序停止、用户成功登录到站点或发生未经处理异常时)时,将引发运行状况监视事件。 这些事件可以记录到任意数目的日志源。 本教程介绍如何通过电子邮件将未经处理异常的详细信息记录到数据库。
本教程侧重于使用运行状况监视来记录未经处理异常,但请记住,运行状况监视旨在测量已部署的 ASP.NET 应用程序的总体运行状况,并包含大量此处未探讨的运行状况监视事件和日志源。 此外,还可以创建自己的运行状况监视事件和日志源(如果需要)。 如果有兴趣详细了解运行状况监视,则第一步是阅读 Erik Reitan 的运行状况监视 常见问题解答。 随后,请查阅如何:在 ASP.NET 2.0 中使用运行状况监视。
编程满意!
深入阅读
有关本教程中讨论的主题详细信息,请参阅以下资源:
- ASP.NET 运行状况监视概述
- 配置和自定义运行状况监视系统 ASP.NET
- 常见问题解答 - ASP.NET 2.0 中的运行状况监视
- 如何:发送电子邮件进行运行状况监视通知
- 如何:在 ASP.NET
- 运行状况监视 ASP.NET