Kusto — извлечение строкового поля в новые столбцы с помощью оператора синтаксического анализа

#azure-data-explorer #kql #re2

#azure-data-explorer #kql #re2

Вопрос:

В моей таблице kusto есть столбец, который содержит несколько сообщений журнала следующего вида

msg1

2020-10-29T12:57:08 00:00 dc1-k30-asw05.nw.domain.com cron: :- addNeighbor: Created neighbor ac:1f:6b:8b:09:99 on Vlan100

msg2

2020-10-29T15:55:20 00:00 dc1-k12-asw30.domain.com cron: :- validatePortSpeed: Unable to validate speed for port 100000000005c. Not supported by platform

Теперь я хочу извлечь из него некоторые вложенные строки в отдельные столбцы, интересующие меня вложенные строки — это значение метки времени ( 2020-11-02T10:31:21 00:00 ) это в основном начало строки, program которая отправила журнал, который cron в данном случае и, наконец, фактическое сообщение журнала. Поэтому я использую parse оператор для этого вместо того, чтобы использовать несколько extract и оценивать шаблон несколько раз.

parse kind = regex message with @".*?" syslogTime:string @"s .*domain.com .*?" program:string @": " msg

Этот запрос приводит к следующим выводам

 "syslogTime": 2020-10-29T12:57:08 00:00,
"program":   cron: :- addNeighbor,
"msg": Created neighbor ac:1f:6b:8b:09:99 on Vlan100,
  
 "syslogTime": 2020-10-29T15:55:20 00:00,
"program":  cron: :- validatePortSpeed,
"msg": Unable to validate speed for port 100000000005c. Not supported by platform,
  

Как видно выше, первое поле анализируется правильно, однако для второго столбца program значение соответствует неверно, механизм регулярных выражений выполняет жадное сопоставление до второго : , хотя я использовал нежадный квантификатор @"s .*domain.com .*?" .

Я также пытался использовать флаг U ungreedy для запроса синтаксического анализа, но при этом последняя часть сообщения не фиксируется.

parse kind = regex flags=U message with @".*" syslogTime:string @"s .*domain.com.*" program:string @": " msg

Результат, который я получаю

 "syslogTime": 2020-11-02T08:47:35 00:00,
"program":  cron,
"msg": 
  
 "syslogTime": 2020-10-29T15:53:36 00:00,
"program":  cron,
"msg": 
  

Для второго столбца, т.Е. program Я хочу сопоставить до первого «:». Я пробовал несколько вариантов приведенных выше запросов, но ни один из них не дал ожидаемого результата. Поэтому я не уверен, чего мне здесь не хватает.

Ответ №1:

Я смог решить эту проблему, изменив выражение синтаксического анализа на следующее.

 parse kind = regex flags=U message with  @".*" syslogTime:string @"s .*domain.com.*" program:string  @": " msg @"$"