Как мне расширить это регулярное выражение данными CEF с помощью этих двух пар значений ключей?

#regex #syslog #azure-log-analytics #kql

#регулярное выражение #системный журнал #azure-log-analytics #kql

Вопрос:

В настоящее время у меня есть это регулярное выражение:

 ?P<key>w )=(?P<value>[a-zA-Z0-9-_:/@. ] 
 

Строка ввода 1: event=1921;json={"source":"A","location":B":"folder":"c:\windows\system32"},"id":2,"address":null,"name":"gone";

Строка ввода 2: dev=b;json={"dest":"123","home":AZ":"loc":"sys"},"ab":9,"home":null,"someKey":"someValue";

Он правильно извлекает «событие = 1921;» но извлекает два других типа.

  1. Как мне извлечь "json={...}" using ключ (JSON) и значение?
  2. Как мне извлечь "name":"gone" , используя ключ (имя) и значение (исчезло)? Решение должно быть динамическим, поскольку ключевые поля будут называться по-разному в других строках.

Ответ №1:

вы должны иметь возможность использовать parse оператор: https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/parseoperator

например:

 print input = 'event=1921;json={"source":"A","location":B":"folder":"c:\windows\system32"},"id":2,"address":null,"name":"gone";'
| parse input with * "json=" json:dynamic ',"id"' * '"name":"' name '"' *
 

если ваши имена полезной нагрузки / свойств полностью динамические, то:

a. Я бы порекомендовал вам оценить ваши варианты структурирования исходных данных в стандартном формате (в настоящее время даже json часть «» недопустима в формате JSON)

б. вы могли бы попробовать следующее — функциональное, но очень неэффективное (не рекомендуется для крупномасштабной обработки данных)

 datatable(input:string)
[
    'event=1921;json={"source":"A","location":B":"folder":"c:\windows\system32"},"id":2,"address":null,"name":"gone";',
    'dev=b;json={"dest":"123","home":AZ":"loc":"sys"},"ab":9,"home":null,"someKey":"someValue";'
]
| parse input with prefix ";json={" json:dynamic '},' suffix
| mv-apply x = extract_all(@'(w )=(w )', prefix) on (
    project p = pack(tostring(x[0]), x[1])
    | summarize b1 = make_bag(p)
)
| mv-apply y = extract_all(@'"(w )":"?(w )"?', suffix) on (
    project p = pack(tostring(y[0]), y[1])
    | summarize b2 = make_bag(p)
)
| project json = strcat("{", json, "}"), b = bag_merge(b1, b2)
| evaluate bag_unpack(b)
 

Комментарии:

1. Интересно! Так что, если для ключевого поля нет «логического» имени, поскольку оно должно быть динамическим? Например. «Id» и «Name» могли быть «x1»

2. это какой-то плохой формат, с которым вы вынуждены работать… это приведет к неэффективности во время запроса. я обновил свой ответ функциональным, но не слишком эффективным решением. вам следует подумать о переформатировании ваших исходных данных в стандартный формат