如何在Azure Log Analytics中用KQL拆分列值生成自定义列
问题描述
我已在Azure Function Cloud App中部署Azure Function App,并创建诊断设置将所有日志发送至Log Analytics工作区。通过以下查询可获取目标日志:
FunctionAppLogs | where FunctionName contains "Function2"
查询结果的Message列格式如下:
user-service URL is healthy. Status code: [{"message":"Success","status":200} audit-service URL is healthy. Status code: [{"message":"Success","status":200}
我需要拆分Message列,提取出user-service、audit-service这类值作为自定义列ServiceName,但尝试以下查询未成功:
FunctionAppLogs | where FunctionName contains "Function2" | extend ServiceName = split(Message, "%-service", 20)
解决方案
可以通过两种可靠方式实现需求:
方法1:使用split函数拆分取首元素
利用空格作为分隔符拆分Message,取第一个元素即可得到目标服务名称:
FunctionAppLogs | where FunctionName contains "Function2" | extend ServiceName = split(Message, " ", 2)[0]
- 说明:
split(Message, " ", 2)会将字符串最多拆分1次,得到两部分内容,[0]取拆分后的第一个元素,正好是user-service或audit-service。
方法2:使用extract函数正则匹配(更精准)
如果日志格式可能存在变化,用正则匹配更稳定,直接提取符合xxx-service格式的内容:
FunctionAppLogs | where FunctionName contains "Function2" | extend ServiceName = extract(@"(\w+-service)", 1, Message)
- 说明:正则
(\w+-service)会匹配由字母/数字/下划线加-service组成的字符串,1表示提取第一个捕获组的内容,精准定位目标服务名称。
原查询失败原因
你之前的split函数使用了错误的分隔符%-service,这个字符串在Message中并不存在,因此拆分结果不符合预期。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

