如何在KQL中使用可复用函数将单列解析为多列
KQL长文本解析逻辑复用解决方案
报错原因
你定义的parseEventData属于表函数,返回的是表结构,不能直接在project/extend运算符中作为标量值调用,因此触发Operator source expression should be table or column报错。
可复用解决方案
方案1:修改为标量动态函数调用
适合需要灵活控制解析后字段展示的场景,将解析结果封装为动态对象返回,可直接在管道中调用:
// 定义解析函数,返回动态类型标量 let parseEventData = (EventData:string){ dynamic(pack( "resourceName", extract("resourceName=([^,]+)", 1, EventData), "totalSlices", tolong(extract("totalSlices=(\\d+)", 1, EventData)), "sliceNumber", tolong(extract("sliceNumber=(\\d+)", 1, EventData)), "lockTime", todatetime(extract("lockTime=([^,]+)", 1, EventData)), "releaseTime", todatetime(extract("releaseTime=([^,]+)", 1, EventData)), "previousLockTime", todatetime(extract("previousLockTime=([^)]+)", 1, EventData)) )) }; // 调用示例 Events | where parameter == "blah" | extend eventParsed = parseEventData(EventData) // 自动展开动态对象的所有字段,无需逐个定义 | evaluate bag_unpack(eventParsed) | project Computer, User, resourceName, totalSlices, sliceNumber, lockTime, releaseTime, previousLockTime
方案2:保留表函数结构,用invoke调用
适合需要完全封装解析逻辑、保留原有表所有字段的场景:
// 定义表函数,接收带EventData字段的表作为输入,追加解析后的字段 let parseEventData = (T:(EventData:string)){ T | parse EventData with * "resourceName=" resourceName ", totalSlices=" totalSlices:long * "sliceNumber=" sliceNumber:long * "lockTime=" lockTime ", releaseTime=" releaseTime:date "," * "previousLockTime=" previousLockTime:date ")" * }; // 调用示例 Events | where parameter == "blah" | invoke parseEventData() | project Computer, User, resourceName, totalSlices, sliceNumber, lockTime, releaseTime, previousLockTime
永久复用技巧
如果使用的是Azure Monitor、Microsoft Sentinel等支持保存函数的环境,可以将上述函数保存为工作区函数,后续所有查询无需重复定义,直接调用函数名即可。
内容的提问来源于stack exchange,提问作者user3868416
相关产品推荐
相关产品推荐

