问题描述
我的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
匹配的值不正确,即使我使用了a,正则表达式引擎也会进行贪心匹配直到第二个:
非贪婪量词@"\s+.*domain.com .*?"
。
对于解析查询,我还尝试使用不贪心标记U
,但消息的最后部分没有被捕获。
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,"msg":
对于第二列,即program
,我想匹配到第一列“:”。我已经尝试了上述查询的多种变体,但没有一个产生预期的输出。所以我不确定我在这里想念什么。
解决方法
我能够通过将parse表达式修改为以下内容来解决此问题。
parse kind = regex flags=U message with @".*" syslogTime:string @"\s+.*domain.com.*" program:string @": " msg @"$"