KQL Azure Log Analytics无法从正则表达式解析日期时间

slmsl1lt  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(131)

给定一个包含列“RawData”和“_ResourceId”(Azure ARM ID)的表,我想从服务器日志文件中解析一个字符串,如下所示:

"09:08:52,198 INFO [web.org.perfmon4j.extras.jbossweb7.P....."

并将字符串的一部分拉到我的定制表中以供以后分析。
Azure日志分析编辑器中的Kusto KQL查询:

suggest_CL
| project dt = todatetime(extract("^([\\:0-9]+)\\,([0-9]+)", 1, 
       "09:08:52,198 INFO [web.org.perfmon4j.extras.jbossweb7.P")),
dtstr = extract("^([\\:0-9]+)\\,([0-9]+)", 1, 
        "09:08:52,198 INFO [web.org.perfmon4j.extras.jbossweb7.P"),
statictimestr = "09:09:52",
statictime = todatetime("09:09:52"),
 _ResourceId, RawData

其中suggest_CL是自定义表
dtstr列显示正则表达式工作并返回正确的时间值。
我包括一些测试字符串:

statictimestr = "09:09:52",

这是一个简单的时间字符串。doc表示,如果不包括日期,则将使用今天的日期。

statictime = todatetime("09:09:52"),

这是上面的字符串转换为datetime
输出为
| dt [UTC]| dtstr|静态时间|静止时间[UTC]|
| - -----|- -----|- -----|- -----|
| | 09:08:52|时间09:09:52| 2023-06-15T09:09:52Z|
dt列为空,这意味着todatetime(...)表达式的计算结果为null。statictime列被标记为[UTC],因此对于字符串文字,仅时间表达式的解析是成功的。输出isnull(todatetime(...))显示true
extract(regex)表达式的输出解析不正确。
另一个SO question回答说格式不正确。这里似乎还有更多的问题,比如一个bug将函数表达式作为todatetime()的参数处理。另一个问题也表达了这种可能性。
有什么想法吗

v1l68za4

v1l68za41#

todatetime()对常数值和计算值有不同的实现-两者不支持相同的格式集。官方支持的格式集(两种格式)在这里记录。
这就是为什么对于不受支持的格式,当您提供常量值时,它可能会对您起作用,但在其他情况下可能不会起作用。
对于不受支持的格式,您可以尝试的一件事是使用parse operator解析单独的日期部分,然后使用the make_datetime() function从中创建日期时间值。
例如:

print input = "09:08:52,198 INFO [web.org.perfmon4j.extras.jbossweb7.P....."
| parse input with hours:int ":" minutes:int ":" seconds:double "," *
| extend dt = make_datetime(datetime_part("Year", now()), datetime_part("Month", now()), datetime_part("Day", now()), hours, minutes, seconds)

相关问题