GetNumberOfEventLogRecords返回错误的事件日志数

时间:2015-07-25 17:00:15

标签: c++ windows winapi service event-log

我有这个C ++代码来读取事件日志记录

DWORD GetLogRecords(LPCWSTR wsLogFile)
{
  HANDLE hEvt = OpenEventLog(NULL, wsLogFile);
  if (hEvt==NULL) return 0;

  DWORD dwTotalRecords;
  BOOL res = GetNumberOfEventLogRecords(hEvt, &dwTotalRecords);
  CloseEventLog(hEvt);

  return (res != 0) ? dwTotalRecords : 0;
}

结果

atlTraceGeneral - C:\Windows\system32\winevt\logs\ACEEventLog.evtx - 23499 Total Records
atlTraceGeneral - C:\Windows\system32\winevt\logs\Application.evtx - 23499 Total Records
atlTraceGeneral - C:\Windows\system32\winevt\logs\ConnectionInfo.evtx - 23499 Total Records
atlTraceGeneral - C:\Windows\system32\winevt\logs\Error.evtx - 23499 Total Records
atlTraceGeneral - C:\Windows\system32\winevt\logs\HardwareEvents.evtx - 23499 Total Records
atlTraceGeneral - C:\Windows\system32\winevt\logs\Internet Explorer.evtx - 23499 Total Records
atlTraceGeneral - C:\Windows\system32\winevt\logs\Key Management Service.evtx - 23499 Total Records
 ...

我已使用计算机上所有.EVTX日志文件的完整路径调用此函数(150个日志文件)。每次它返回23499!我的日志文件有不​​同的大小和一些0,为什么我总是得到23499?

UPDATE2:现在我清除了应用程序日志后,所有.evtx日志文件都得到0。我认为它总是获取应用程序日志而不是指定的.evtx文件。

更新:正如Remy Lebeau所说,但结果仍然相同。

2 个答案:

答案 0 :(得分:2)

为了其他人的利益,此问题的解决方案是OpenEventLog不接受路径名。相反,您必须为其提供事件日志的源名称(类似"HardwareEvents")。

如果您使用无效的源名称(包括提供路径名)来呼叫OpenEventLog,那么如文档所示,它将打开Application日志:

  

如果指定自定义日志但无法找到,则会记录事件   service打开应用程序日志。

答案 1 :(得分:1)

您没有检查GetNumberOfEventLogRecords()的错误结果。而你正在泄漏日志句柄。试试这个:

DWORD GetLogRecords(LPCWSTR wsLogFile)
{
  HANDLE hEvt = OpenEventLog(NULL, wsLogFile);
  if (hEvt==NULL) return 0;

  DWORD dwTotalRecords;
  BOOL res = GetNumberOfEventLogRecords(hEvt, &dwTotalRecords);
  CloseEventLog(hEvt);

  return (res != 0) ? dwTotalRecords : 0;
}