在软件开发中,事件日志是一种记录应用程序运行时信息的重要方式。通过事件日志,开发者可以追踪应用程序的行为,诊断问题,以及监控应用程序的健康状况。然而,当涉及到自定义事件日志记录时,开发者可能会面临一些挑战,比如如何正确地设置日志的严重性级别和类别。本文将介绍如何根据Web事件来自定义事件日志的严重性级别和类别,并展示如何使用ASP.NET的资源文件来设置正确的类别文本。
在事件日志中,严重性级别用于指示事件的重要性。例如,信息级别的事件通常用于记录应用程序的正常操作,而错误级别的事件则用于指示出现了问题。在ASP.NET中,默认的事件日志提供者(EventLogWebEventProvider)主要使用信息级别,偶尔使用警告级别,但很少使用错误级别。
如果正在创建自己的事件日志提供者,可以根据源Web事件来映射事件日志条目的严重性类型。以下是一些常见的Web事件及其对应的事件日志条目严重性:
WebBaseEvent -> EventLogEntryType.Information
WebManagementEvent -> EventLogEntryType.Information
WebApplicationLifetimeEvent -> EventLogEntryType.Information
WebRequestEvent -> EventLogEntryType.Information
WebHeartbeatEvent -> EventLogEntryType.Information
WebBaseErrorEvent -> EventLogEntryType.Warning
WebRequestErrorEvent -> EventLogEntryType.Error
WebErrorEvent -> EventLogEntryType.Error
WebAuditEvent -> EventLogEntryType.Information
WebSuccessAuditEvent -> EventLogEntryType.SuccessAudit
WebAuthenticationSuccessAuditEvent -> EventLogEntryType.SuccessAudit
WebFailureAuditEvent -> EventLogEntryType.FailureAudit
WebAuthenticationFailureAuditEvent -> EventLogEntryType.FailureAudit
WebViewStateFailureAuditEvent -> EventLogEntryType.FailureAudit
可以选择完全按照默认的EventLogWebEventProvider的方式来映射Web事件,或者根据应用程序需求来自定义这些映射。
虽然所有的Web事件都属于同一个类别“Web Events”,但问题在于如何使正确的文本显示出来。类别属性的值是一个资源字符串,为了选择正确的类别值,需要设置确切的资源键。这并不是很难做到,可以创建一个只包含一个资源的资源汇编,但有一个更好的方法:使用ASP.NET使用的相同资源汇编。
要找出应该使用哪个汇编,可以使用regedit.exe查看注册表中的"HK_LM\System\CurrentControlSet\Services\EventLog\Application\ASP.NET 2.0.50727.0"。在这里,需要查找的是“ASP.NET 2.0.50727.0”事件日志源使用的设置,它是用来写入Web事件事件日志条目的。
需要使用的设置是CategoryCount和CategoryMessageFile键,因为它们指示加载哪个类别汇编。以下是这些键的名称和数据:
Name: CategoryCount
Data: 5
Name: CategoryMessageFile
Data: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_rc.dll
请注意,CategoryMessageFile的路径可能会根据操作系统和ASP.NET版本而有所不同。
最后,需要知道“Web Event”字符串的确切资源键。由于汇编中只有5个资源,所以很快就能得到以下表格:
Category Resource Key
0 None
1 Setup
2 Uninstall
3 Web Event
4 File Monitoring
5 Admin Service
现在,只需要配置事件日志源来使用这些相同的设置。
如前所述,可以使用EventLog.CreateEventSource方法来创建一个事件日志源,但是对于设置CategoryCount和CategoryMessageFile值,必须使用这个特定的重载:
EventLog.CreateEventSource(EventSourceCreationData sourceData)
就是这样...已经得到了需要的一切,最终的结果看起来像这样:
它看起来与通常的相似,但如果仔细看,会发现差异。