给定一个包含列“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()
的参数处理。另一个问题也表达了这种可能性。
有什么想法吗
1条答案
按热度按时间v1l68za41#
todatetime()
对常数值和计算值有不同的实现-两者不支持相同的格式集。官方支持的格式集(两种格式)在这里记录。这就是为什么对于不受支持的格式,当您提供常量值时,它可能会对您起作用,但在其他情况下可能不会起作用。
对于不受支持的格式,您可以尝试的一件事是使用
parse
operator解析单独的日期部分,然后使用themake_datetime()
function从中创建日期时间值。例如: