一个简单的可自定义的 Windows 事件日志应用程序






2.73/5 (9投票s)
2005年2月21日
4分钟阅读

64453

764
一篇关于编写简单的 Windows 事件日志记录器的文章。
引言
在生产环境中,无论是客户端-服务器应用程序、后端应用程序(如 Windows 服务)还是电子商务网站,有效的日志记录正成为一项常见的业务需求。事件日志记录是任何应用程序进行调试、跟踪和监控的核心。一旦应用程序进入生产环境,事件日志就是监控应用程序和找出应用程序失败原因的最有效也是唯一的方法。前提是日志机制有效且可配置以适应业务需求,这是获取应用程序失败细节的最快方式。本文旨在为应用程序设计者提供一个简单、可配置且有效的日志记录机制。
在本文中,我将讨论
- 编写任何日志记录应用程序的最常见要求。
- 如何编写一个简单的日志记录应用程序,该应用程序使用 Windows 事件日志来记录错误、警告和信息消息。
- 日志记录应用程序的灵活性以适应客户需求。
日志记录应用程序的代码是可下载的。它使用 SQL Server 数据库来存储信息、错误和警告消息。这样可以避免在代码中硬编码消息,从而可以在不重新编译代码的情况下灵活地更新任何消息。
该应用程序是可配置的,并保护客户只记录特定类型消息的利益。它还提供了硬编码消息和消息类型的机制,这些消息和消息类型将被记录到 Windows 事件日志中。
背景
我见过设计师和开发人员在设计一个能够提供应用程序清晰视图并且足够智能以过滤特定类型消息的日志记录机制时举步维艰。在这里,我将讨论如何编写一个日志记录应用程序,您可以在其中设置日志级别来过滤特定类型的消息。这允许客户过滤掉不需要的消息,并防止它们被记录到事件日志中。
编写日志记录应用程序的最常见要求
根据我的经验,我观察到以下是编写任何日志记录应用程序的最常见要求:
- 无需指定消息类型即可轻松将消息记录到日志接收器。
- 在不重新编译代码的情况下,足够灵活地更改消息描述。
- 能够硬编码调试消息(特别适用于 Windows 服务等后端应用程序,有助于调试)。
- 拥有一个用户友好的界面,可以根据类型、用户、日期、来源等对消息进行排序。
轻松将消息记录到 Windows 事件日志的步骤
测试事件日志记录应用程序的简单步骤就是下载代码,执行数据库脚本,然后按原样运行代码。就是这样!代码包含日志记录 DLL 以及测试该 DLL 的测试应用程序。详细描述如下:
步骤 1:创建日志数据库
下载并执行数据库脚本到您的应用程序的 SQL Server 数据库中。这将创建一个用于存储预定义消息的表(名称:Messages)。脚本还将创建检索相应消息并将其记录到事件日志所需的存储过程。
步骤 2:配置应用程序设置
- 在您的应用程序配置文件中,指定连接字符串和
MessageLoggingParameter
。 MessageLoggingParameter
的值可以设置为 0 到 7,如下所示:MessageLoggingParameter
0:- 不会记录任何消息。MessageLoggingParameter
1:- 只记录信息消息。MessageLoggingParameter
2:- 只记录警告消息。MessageLoggingParameter
3:- 只记录错误消息。MessageLoggingParameter
4:- 只记录信息和警告消息。MessageLoggingParameter
5:- 只记录警告和错误消息。MessageLoggingParameter
6:- 只记录信息和错误消息。MessageLoggingParameter
7:- 记录所有消息。
- 指定应用程序的日志名称。这将在 Windows 事件日志的左侧窗格中显示为单独的条目。
<add key = "LogName" value="Test Log"/>
- 指定应用程序源
<add key = "EventSource" value="My Application"/>
步骤 3:记录消息
现在您可以准备将消息记录到 Windows 事件日志中了。这是一个简单的步骤。只需将带有 MessageID、消息类型(错误、信息、警告)和消息描述的消息添加到 Messages 表中。这将创建您的消息存储,有助于在不重新编译代码的情况下更新任何消息,并且这些消息将被记录到 Windows 事件日志中。记录消息到事件日志的代码如下:
//Instantiate the Logger class
Logger logger = new Logger();
//Call the Write method and pass the MessageID.
//This retrieves the corresponding info from DB
//and log it to Windows Event Log.
logger.Write(3);
//Alternatively, if you don't want to retrieve
//the message from DB and want to write your
//own message, call the overloaded Write
//method with 2 parameters.
logger.Write("This is my message","Information");
日志记录器类
让我们看看日志记录器类中负责配置、从数据库检索消息以及将消息记录到 Windows 事件日志的功能。
Write
方法首先根据传递给它的 MessageID 从数据库检索消息类型和消息描述。然后,如果事件日志和事件源不存在,Write
方法会创建它们。
EventLog objEventLog = new EventLog(strLogName);
if(!EventLog.SourceExists(strEventSource))
{
EventLog.CreateEventSource(strEventSource, strLogName );
}
然后,该函数根据 app.config 文件中配置的消息类型和客户端的兴趣信息,判断是否记录消息,并相应地进行记录。
//If message is a Information and MessageLoggingParameter
// is configured to log this message then log it
if( (strMessageType.ToUpper().CompareTo("INFORMATION")
== 0) && ( (iMsgLogParam == 1) || (iMsgLogParam == 4)
|| (iMsgLogParam == 6) || (iMsgLogParam == 7)
|| (iMsgLogParam == 8) ) )
{
objEventLog.WriteEntry(strMessageDesc,
EventLogEntryType.Information);
}
然而,在 Write
方法的重载方法中,由于消息描述和消息类型由用户提供,因此省略了从数据库获取消息详细信息的步骤。
结论
我衷心希望这里提供的日志记录器应用程序设计和示例代码能对应用程序设计者和开发人员有所帮助。