Использование полей данных, содержащих XML, для суммирования событий Windows в аналитике журналов

В Azure Log Analytics я пытаюсь анализировать события, созданные планировщиком задач, и группировать их по имени выполняемой задачи.

Базовый запрос выглядит так

Event 
| where Source == "Microsoft-Windows-TaskScheduler" 
and TimeGenerated > ago(24h) 
and EventLog == "Microsoft-Windows-TaskScheduler/Operational" 
and EventID == 201

Я борюсь с задачей группировки результатов по именам запланированных задач, поскольку имена содержатся в данных в кодировке XML в атрибутах ParameterXML и EventData, которые имеют следующие форматы:

ParamterXML:

<Param>\MyScheduledTasksName</Param>
<Param>{1F1893C6-0696-430C-9738-50B068DDE37B}</Param>
<Param>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</Param> 
<Param>0</Param>
<Param>9684</Param>

EventData:

<DataItem type="System.XmlData" time="2019-06-13T11:18:45.4806563+02:00" sourceHealthServiceId="D4165670-2EBA-67E0-FF6B-1D838007CE5B">
  <EventData Name="ActionSuccess" xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
    <Data Name="TaskName">\MyScheduledTasksName</Data>
    <Data Name="TaskInstanceId">{1F1893C6-0696-430C-9738-50B068DDE37B}</Data>
    <Data Name="ActionName">C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</Data>
    <Data Name="ResultCode">0</Data><Data Name="EnginePID">9684</Data> 
 </EventData>
</DataItem>

Как мне подойти к синтаксическому анализу имени задачи XML, чтобы я мог использовать его для группировки / суммирования в канале?


person syneticon-dj    schedule 13.06.2019    source источник


Ответы (2)


вот пример использования parse_xml() в сочетании с mv-apply для доступа только к определенным элементам полезной нагрузки XML, например TaskName в этом случае:

datatable(id:int, EventData:string)
[
    1, '<DataItem type="System.XmlData" time="2019-06-13T11:18:45.4806563+02:00" sourceHealthServiceId="D4165670-2EBA-67E0-FF6B-1D838007CE5B">\n  <EventData Name="ActionSuccess" xmlns="http://schemas.microsoft.com/win/2004/08/events/event">\n    <Data Name="TaskName">\\MyScheduledTasksName</Data>\n    <Data Name="TaskInstanceId">{1F1893C6-0696-430C-9738-50B068DDE37B}</Data>\n    <Data Name="ActionName">C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe</Data>\n    <Data Name="ResultCode">0</Data><Data Name="EnginePID">9684</Data>\n </EventData>\n</DataItem>',
    2, '<DataItem type="System.XmlData" time="2019-06-13T11:18:45.4806563+02:00" sourceHealthServiceId="D4165670-2EBA-67E0-FF6B-1D838007CE5B">\n  <EventData Name="ActionSuccess" xmlns="http://schemas.microsoft.com/win/2004/08/events/event">\n    <Data Name="TaskName">\\MyOtherTask</Data>\n    <Data Name="TaskInstanceId">{1F1893C6-0696-430C-9738-50B068DDE37B}</Data>\n    <Data Name="ActionName">C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe</Data>\n    <Data Name="ResultCode">0</Data><Data Name="EnginePID">9684</Data>\n </EventData>\n</DataItem>'
]
| mv-apply EventData = parse_xml(EventData).DataItem.EventData.Data on 
(
    where EventData['@Name'] ==  'TaskName'
    | project TaskName = EventData['#text']
)

Приведенный выше запрос возвращает следующую таблицу:

| id | TaskName              |
|----|-----------------------|
| 1  | \MyScheduledTasksName |
| 2  | \MyOtherTask          |
person Yoni    schedule 13.06.2019
comment
Спасибо, это сработало. Последующий | summarize count() by tostring(TaskName) дал мне результат, который я искал. - person syneticon-dj; 13.06.2019

Похоже, вы ищете функцию parse_xml (): https://docs.microsoft.com/en-us/azure/kusto/query/parse-xmlfunction

person Avnera    schedule 13.06.2019