检索事件日志在DATA标记中包含特定的字符串

时间:2018-06-20 11:47:56

标签: c++ winapi mfc event-log event-viewer

我已经开发了一个MFC应用程序,该应用程序从windows event logsevent log file)文件中读取EVTX并解析为在应用程序中呈现

对于读取日志文件,我使用XPATH查询从包含40000条记录的event log file文件中检索特定的事件日志

示例日志记录如下代码

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Error_Log"/>
    <EventID Qualifiers="20225">6002</EventID>
    <Level>4</Level>
    <Task>0</Task>
    <Keywords>0x80000000000000</Keywords>
    <TimeCreated SystemTime="2018-05-31T10:37:16.000000000Z"/>
    <EventRecordID>11679958</EventRecordID>
    <Channel>Application</Channel>
    <Security/>
  </System>
  <EventData>
    <Data>16:07:16.339:(A)[app.exe] [scan] m_id = [1254]</Data>
    <Binary>31363A30373A31362E3333393A2841295B7275706170702E6578655D205B5363616E5D206D5F6964203D205B313235345D</Binary>
  </EventData>
</Event>

在这里,我只想检索<DATA>标记包含子字符串值m_id的那些日志记录。为此,我在query

下进行了尝试
LPWSTR Query = _T("Event/EventData[Data(Data='m_id')]");

EVT_HANDLE Results = EvtQuery(NULL, Path, Query, EvtQueryFilePath | EvtQueryForwardDirection);  

但是即使输入日志文件中存在字符串m_id,如上面的代码所示,我也无法检索任何日志

1 个答案:

答案 0 :(得分:0)

您应该能够通过使用contains()使用XPath 2做到这一点

完整事件:

/Event[EventData/Data[contains(text(),'m_id')]]
/Event[EventData/Data[contains(string(),'m_id')]]

仅数据:

/Event/EventData/Data[contains(string(),'m_id')]
/Event/EventData/Data[contains(text(),'m_id')]

Test Xpaths here

Advanced Xpath Filtering

string vs text