天天看点

c++写入应用程序日志(Event Log )

c++写入应用程序日志(Event Log )

分类:  C++程序开发2010-12-03 14:16  410人阅读  评论(0)  收藏  举报

日志文件是操作系统的一部分,那么肯定有应用程序编程接口(API)来支持建立日志记录

实例:

 HANDLE h; 

 if ((h = RegisterEventSource(NULL,TEXT("MetaLive"))) == NULL)

 { 

  return FALSE;

 }

 const char* ps = "pszS1pszS2pszS3";

 WORD wType=EVENTLOG_ERROR_TYPE;//EVENTLOG_INFORMATION_TYPE;

 DWORD dwID=5001;

 int iStr = 1;

 BOOL bRet;

 DWORD dword;

 if (h) 

 {

  bRet=::ReportEvent(h,

       wType,

       0,

       dwID,

       NULL, // sid

       iStr,

       0,

       &ps,

       NULL);

  dword=::GetLastError();

 }

 //

基于 Windows XP 的计算机将事件记录在以下三种日志中:

1. 应用程序日志 

应用程序日志包含由程序记录的事件。例如,数据库程序可能在应用程序日志中记录文件错误。写入到应用程序

日志中的事件是由软件程序开发人员确定的。 

2. 安全日志

安全日志记录有效和无效的登录尝试等事件,以及与资源使用有关的事件(如创建、打开或删除文件)。例如,

在启用登录审核的情况下,每当用户尝试登录到计算机上时,都会在安全日志中记录一个事件。您必须以 Administrator 

或 Administrators 组成员的身份登录,才能打开、使用安全日志以及指定将哪些事件记录在安全日志中。 

3. 系统日志 

系统日志包含 Windows XP 系统组件所记录的事件。例如,如果在启动过程中未能加载某个驱动程序,则会在

系统日志中记录一个事件。Windows XP 预先确定由系统组件记录的事件。 

本文,我们专注于第一类应用程序日志,介绍如何写入一条EventLog。Windows使用ReportEvent 报告应用程序消息,

下面就对这个函数做点简单的介绍。

    HANDLE hEventLog, // RegisterEventSource返回的handle
    WORD wType, // 要记录的事件类型
    WORD wCategory, // 事件种类
    DWORD dwEventID, // 事件标示
    PSID lpUserSid, // 用户安全标示(可选)
    WORD wNumStrings, // 消息的字符串数
    DWORD dwDataSize, // 以字节为单位的二进制数据的大小
    LPCTSTR *lpStrings, // 消息本身
    LPVOID lpRawData  // 二进制数据
   );

Parameters

hEventLog 

事件标志。这个是 RegisterEventSource 返回的handle. 

wType 

事件的类型。可以是如下中的一个:

Value     Meaning 

EVENTLOG_ERROR_TYPE     Error event 

EVENTLOG_WARNING_TYPE     Warning event 

EVENTLOG_INFORMATION_TYPE     Information event 

EVENTLOG_AUDIT_SUCCESS     Success Audit event 

EVENTLOG_AUDIT_FAILURE     Failure Audit event 

wCategory 

指出消息种类。这个地方是由源自己定义的,可以是任何值。 

dwEventID 

事件标识。根据我的理解,这里的标识在使用时,会又源解释为具体的含义。比如:2001表示文件打开错误等等。

因此,要想设定完整的Event Log还需要在系统中注册一个解释的服务程序。示例程序并没有设计这个服务,

读者可以参考另外的那个VB程序。 

lpUserSid 

指向用户安全标示。当不需要安全标示时,该参数可以为NULL. 

wNumStrings 

给定lpStrings 指向的数组中字符串组的数量。0表示当前没有字符串组。

dwDataSize 

给出将写入Evenet Log的数据的大小,以字节为单位。如果这个参数为0,表示当前没有事件数据。 

lpStrings 

指向一个缓冲区,其中是一个以0为结尾的字符串数组,这个数组将会添加到消息中。即使dwDataSize 参数为0,

这个参数也必须是有效的指针(或者为NULL)。数组中每个字符串最大为32K 字节。 

lpRawData 

指向包含二进制数据的缓冲区。即使dwDataSize 参数为0,该项也必须是一个有效的指针(或者为NULL).

Return Values

如果执行成功,返回非零值,表示事件入口已经写入日志。

如果执行不成功,返回0.