Windows7系统事件日志分析与编程
2014-08-07周鹏
周 鹏
(92124部队计算机应用技术,大连116023)
Windows7系统事件日志分析与编程
周 鹏
(92124部队计算机应用技术,大连116023)
事件日志作为一种重要的系统管理工具,主要用于监视系统运行情况、查找系统故障根源和分析软件的执行流程等。对软件开发者而言,有必要从编程角度分析Windows7系统的事件日志架构体系。简要介绍NET Framework一个重要的事件日志类EventLog,以及使用EventLog类和C++/CLI语言实现事件日志创建、写入和删除的编程方法。
事件日志;事件源;EventLog类
1 引 言
Windows7系统有许多应用程序的活动都需要进行记录。对于大多数长时间不间断运行的服务(Service)而言,日志(Log)是管理员了解系统运行情况的最重要途径之一,如果有问题出现,日志也是发现和定位故障(Trouble Shooting)的第一手资料[1]。在开发应用程序时,如果使用常规的调试工具难以发现程序出错的原因,可以使用日志来记录程序的运行信息,帮助程序员分析查找问题。
Windows7使用事件日志(Event Log)机制来存储、记录、浏览和维护日志。该机制从NT 3.5开始得到支持,在Windows7中得到了进一步增强,是Windows平台上关键系统技术之一[2]。系统管理员可以使用事件查看器获得系统和应用程序的重要信息和警告信息。事件日志机制允许写入应用程序的信息。如果应用程序出现问题,应将错误信息写入事件日志,再用事件查看器读取这些信息。
以下将分析Windows7事件日志的架构体系,介绍.NET Framework事件日志类以及用C++/CLI代码片段展示事件日志的编程方法。
2 事件日志的架构体系
应用程序进程通过远程过程调用机制(RPC,Remote Procedure Call)向系统的服务进程发出操作事件日志的调用请求,经过RPC机制的一系列操作后,服务进程调用系统API函数WriteToLog()将事件日志记录写入日志文件。事件日志机制的基本架构图如图1所示,左侧表示调用日志记录服务的应用程序进程,中间表示承担日志服务的服务进程,右侧表示集中存储日志记录的日志文件。
图1 事件日志机制的基本架构图
2.1 日志文件
Windows7有三个默认的事件日志:一个应用程序事件日志,一个安全事件日志,一个系统事件日志。除这些日志外,还可能会有应用程序安装到服务器上的其它日志,以及用户创建的自定义日志。每一类事件日志信息分别保存在一个文件中,如应用程序日志、安全日志和系统日志的文件分别是AppEvent.Evt、SecEvent.Evt和SysEvent.Evt,这些文件存放在用于存储注册表文件和系统配置信息的%SystemRoot%\SYSTEM32\CONFIG\目录中。需要注意的是,从启动到关闭,系统都以独占(Exclusive)方式使用系统日志文件,删除或其它写访问都会被拒绝。
查看事件日志服务的注册表配置,会注意到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControl-Set\Services\EventLog下的几个表项带有指向特定文件的配置。系统日志文件用于系统和设备驱动程序,应用程序和服务则将事件写入应用程序日志,安全日志是应用程序的只读日志。操作系统的审计功能使用安全日志。每个应用程序还可以创建定制的类别和日志文件,在其中写入事件日志项。
管理工具“事件查看器”用于浏览和管理事件日志,是监视系统运行状况以及在出现问题时解决问题的必不可少的工具。在事件日志记录中通常含有类型、级别、日期和时间、来源、事件ID、任务类别等信息。
2.2 事件源
在向一个事件日志写入日志前,必须注册一个事件源,就是在事件日志的注册表键下建立一个子键,并赋予子键合适的键值。例如,在应用程序日志中注册了名为EventLog_Source的事件源,注册表入口为HKEY_LOCAL_MACHINE\SYSTEM\Current-ControlSet\Services\EventLog\Application\EventLog_ Source,键EventMessageFile的键值为%SystemRoot%\System32\wersvc.dll,键TypesSupported的键值为0x00000007。
其中,键EventMessageFile用来指定这个事件源消息文件(Message File)的位置和名称。消息文件就是包含消息资源(message resource)的文件,消息资源与字符串资源和对话框资源的性质是相同的,不过它的作用是充当模板来格式化日志事件或其它消息。消息资源是由消息源文件通过消息编译器(Message Compiler)编译成二进制格式,然后连接到EXE文件或DLL文件中的。一个事件源必须至少有一个消息文件。键TypesSupported是16位无符号整数,用来指定该事件源所支持的事件类型。
使用事件类属的事件源可以通过键值Category-Count定义该事件源支持的事件类属个数,通过键值CategoryMessageFile指定类属消息文件位置和名称。对于使用参数文件的事件源,可以通过键值ParameterMessageFile指定参数文件位置和名称,多个文件的需要使用分号分开。
2.3 事件日志服务
Windows系统默认启动的服务中包含负责事件日志的服务Event Log,对它的描述是“此服务管理事件和事件日志。它支持日志记录事件、查询事件、订阅事件、归档事件日志以及管理事件元数据。它可以用XML和纯文本两种格式显示事件。停止该服务可能危及系统的安全性和可靠性”。在Windows7中,事件日志服务运行在进程svchost.exe中,是自动启动并且不可停止的。svchost.exe进程是关键系统进程,使用任务管理器也无法终止该进程,如果使用其它工具强行中止,那么系统检测到后会自动关机。
事件日志服务的功能是管理和维护事件日志文件,并通过RPC机制向应用程序提供各种日志服务,包括添加、删除日志记录,获取日志信息,备份日志文件等。
2.4 事件日志的数据组织
作为一种通用的日志记录机制,事件日志必须以一种统一的方式组织和存储不同信息量和不同结构的事件记录。Windows7将事件的格式信息与实际数据分别存储,并将二者通过一个ID联系起来。其中,事件的格式信息存储在消息文件中,事件描述中的变化部分存储在日志文件中。
事件日志以表格的形式存储日志记录,表格的每一行对应一条日志记录,存储着这条记录的基本信息和附属信息的偏移地址。事件日志文件中的数据表结构用EVENTLOGRECORD结构来描述,每个字段相当于表格的一列。该数据结构没有包含事件源和计算机名信息,因为事件源和计算机名是在上一层次记录的,当打开一个事件日志时就已经指定了这些信息,随后的所有操作都是针对该事件日志进行的。
3 事件日志类
为了便于在Windows7的应用程序中使用和定制事件日志,.NET Framework的System.Diagnostics命名空间中提供了用于实现事件日志操作的类,包括EventLog、EventLogEntry、EventLogInstaller等[3]。其中,EventLog类是事件日志的核心。EventLog类提供在本地或远程计算机上写入事件日志、读取事件日志项、创建和删除事件日志与事件日志源的功能[4]。
EventLog类的重要属性包括:①Entries:读取事件日志;②Log:指定用于读写事件日志的记录;③LogDisplayName:返回日志的显示名称;④Machine Name指定读写日志项的系统;⑤Source:指定要写入日志项的源。
EventLog类的重要方法包括:①CreateEvent Source():创建一个新的事件源和一个新的日志文件;②DeleteEventSource():删除一个事件源;③Source Exists():验证事件源是否存在;④WriteEntry()或WriteEvent():写入事件日志项;⑤Clear():删除事件日志的所有项;⑥Delete():删除一个完整的事件日志。
以下将展示使用EventLog类和C++/CLI语言实现事件日志的创建、写入和删除的编程方法。
3.1 创建事件源
事件源的名称是写入事件的应用程序标识符。在读取事件日志时,该信息有助于识别事件的日志项,将它们映射到应用程序类别上。事件源的名称可以任意命名,如果设置事件日志的名称为Application,就会把事件日志项写入应用程序日志。设置不同的应用程序日志名可以创建其自己的日志。
在写入事件日志之前,必须创建一个事件源。为此,可以使用EventLog类或EventLogInstaller类的CreateEventSource()方法。
以下的代码首先验证事件源MySource是否存在,若不存在,则实例化EventSourceCreationData类型对象,定义事件源名字MySource和日志名字My-Log,然后调用CreateEventSource()方法创建事件源MySource,产生的事件将全部写入MyLog事件日志。
需要注意的是,创建事件源时需要有管理员权限。
使用EventSourceCreationData类型的属性参数,可以为事件日志指定更多的重要信息。属性Source可获取或设置事件源的名称;属性LogName定义事件日志项写入的日志名称,默认为应用程序日志;属性MachineName定义读写日志项的系统或者远程主机;属性CategoryResourceFile定义类别的资源文件,类别可以用于过滤单一源中的事件日志项;属性CategoryCount定义类别资源文件中的类别数量;属性MessageResource File指定应用程序在事件日志中写入资源文件定义的信息;ParameterResourceFile指定在资源文件中定义字符串为资源文件的信息提供参数。
3.2 写入事件日志
向事件日志中写入信息,首先需要创建一个EventLog类的实例并指定事件源,然后调用该类的静态方法WriteEntry()或动态方法WriteEvent()向事件日志中写入信息。
WriteEntry()的参数是事件源,该事件源也可以用EventLog类的构造函数设置。在下面的构造函数中,定义了日志名、本地机器和事件源名。接着将信息作为WriteEntry()的第一个参数,写入三个时间日志项。第二个参数是EventLogEntryType类型的枚举。使用EventLogEntryType,可以制定时间日志项的严重级别。其值可以是Information、Warning、Error、用于审计的FailureAudit和SuccessAudit。事件查看器根据该类型会显示不同的图标。第三个参数指定与应用程序相关的事件ID,它可以由应用程序使用。另外,还可以传送与应用程序相关的二进制数据和类别。
以下代码创建了一个EventLog类的实例并指定事件源,然后向事件日志中写入信息。
EventLog^mylog=gcnew EventLog();
mylog->Source="MySource";
mylog->WriteEntry("Writing to event log.");Console::WriteLine("Writing to event log...");
写入事件日志后,用户可以通过事件查看器监视在应用程序日志里记录的名为MyLog的事件。
3.3 删除事件日志
EventLog类提供静态方法Delete()用于删除日志记录项,如果要删除已经创建的事件源,需要调用静态方法DeleteEventSource()。对EventLog类本身直接调用静态方法,而不必创建该类的实例。
4 结束语
事件日志是管理员进行系统维护的主要工具之一,也是一种简单有效的软件调试工具。掌握Windows7系统的事件日志机制和编程方法,利用事件日志信息跟踪软件的运行过程,分析其执行路线,对于分析系统运行情况和寻找软件故障的根源有重要意义。
[1]张银奎.软件调试[M].北京:电子工业出版社,2008.
[2]尹成,颜成钢.Visual C++2010开发权威指南[M].北京:人民邮电出版社,2010.
[3]Christian Nagel,Bill Evjen,Jay Glynn.C#高级编程(第6版)[M].北京:清华大学出版社,2010.
[4]Microsoft..NET Framework应用程序的基于服务器的组件[DB/OL].(2010),MSDN Library.
Analysis and Programm ing of Event Log in W indows7 System
ZHOU Peng
(Computer Application Technology,Unit92124 of PLA,Dalian 116023,China)
As an important tool for system management,Event Log ismainly used to monitor the operation of the system,find the cause of system failures,and analyse the excuting process of software.For software developer,it is necessary to analyse the Event Log architecture of Windows7 from the programming point of view.EventLog,an important class of Event Log in NET Framework,is briefly introduced,and the programmingmethodswhich are used to create,write and delete Event Logwith class EventLog and C++/CLI language,are demonstrated aswell.
Event Log;Event Source;Class EventLog
10.3969/j.issn.1002-2279.2014.04.022
TP311.1
:A
:1002-2279(2014)04-0068-03
周鹏(1978-),男,山东胶州人,工程师,硕士,主研方向:分布式系统、软件工程。
2013-12-30