天天看點

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.