Azure Analytics Log提取FunctionAppLogs的Message中JSON至列的问题
Azure Log Analytics提取FunctionAppLogs中Message字段JSON内容的解决方案
问题分析
你的查询返回空白结果,大概率是以下几个原因导致:
Message字段并非纯JSON字符串,包含前缀文本(比如"Telemetry Message: "),直接用parse_json解析会失败- 错误使用
mv-expand:如果MessageObject是单个JSON对象而非数组,mv-expand会将其转为空值 - JSON字段路径或大小写不匹配,导致无法提取
humidity值
分步解决方案
1. 先排查Message的实际格式
先运行基础查询查看原始Message内容,确认JSON部分的结构:
FunctionAppLogs | order by TimeGenerated desc | where FunctionName == "TelemetryListenerCalculateAlgoPostNewState" | where Message has "Telemetry Message" | where TimeGenerated > datetime(2022-11-25 06:38) and TimeGenerated < datetime(2022-11-25 06:50) | project Message
2. 针对带前缀的Message提取JSON
如果Message格式类似"Telemetry Message: {"humidity": 55, ...}",先提取JSON部分再解析:
FunctionAppLogs | order by TimeGenerated desc | where FunctionName == "TelemetryListenerCalculateAlgoPostNewState" | where Message has "Telemetry Message" | where TimeGenerated > datetime(2022-11-25 06:38) and TimeGenerated < datetime(2022-11-25 06:50) // 提取"Telemetry Message: "后的JSON内容 | extend JsonPart = extract(@"Telemetry Message:\s*(.*)", 1, Message) | extend MessageObject = parse_json(JsonPart) // 单个JSON对象无需mv-expand,直接提取字段 | extend myhumidity = MessageObject.humidity | project TimeGenerated, myhumidity
3. 纯JSON对象的简化查询
如果Message本身就是纯JSON字符串,移除多余的mv-expand即可:
FunctionAppLogs | order by TimeGenerated desc | where FunctionName == "TelemetryListenerCalculateAlgoPostNewState" | where Message has "Telemetry Message" | where TimeGenerated > datetime(2022-11-25 06:38) and TimeGenerated < datetime(2022-11-25 06:50) | extend MessageObject = parse_json(Message) | extend myhumidity = MessageObject.humidity | project myhumidity
4. 处理嵌套字段或大小写问题
如果humidity在嵌套层级中,或键名大小写不匹配,调整字段路径:
// 示例:嵌套在data字段下 | extend myhumidity = MessageObject.data.humidity // 示例:键名首字母大写 | extend myhumidity = MessageObject.Humidity
关键注意事项
- 只有当
MessageObject是JSON数组时,才需要使用mv-expand展开元素 - 解析后可以通过
project Message, MessageObject查看MessageObject是否为有效对象,验证解析是否成功
内容的提问来源于stack exchange,提问作者Sergio Solorzano
相关产品推荐
相关产品推荐

