Azure Log Analytics单条错误拆分为多行日志的合并方法咨询
解决Azure Log Analytics中多行错误日志拆分的问题
从源头避免拆分(推荐方案)
如果日志还未收集或可调整采集配置,优先从采集阶段解决:
- 自定义日志采集:配置Azure Monitor Agent/Log Analytics Agent的自定义日志数据源时,设置多行识别规则。比如:
- 若日志以时间戳开头(如
2024-05-20 14:30:00 ERROR: ...),将多行模式设为匹配时间戳的正则(如^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}),以此作为新日志条目的起始标记。 - 若错误以特定关键字开头(如
ERROR:),将多行模式设为^ERROR:,后续关联行自动合并为单一条目。
- 若日志以时间戳开头(如
- 应用日志输出优化:如果是应用生成的日志,调整日志框架(如Serilog、NLog)配置,将完整错误信息(包括堆栈跟踪)作为单个结构化字段输出,而非逐行打印。比如用Serilog时,通过
Destructure.TransformErrors()将异常信息序列化到单个属性中。
已采集日志的查询阶段合并
如果日志已经拆分存储,可以用Kusto查询语言(KQL)合并同一条错误的多行内容:
基于关联ID合并(最准确)
如果日志包含唯一关联标识(如OperationId、CorrelationId),用以下查询:
// 替换为你的日志表名 YourLogTable | where TimeGenerated between (ago(2h) and now()) | where Message has "ERROR" // 按关联ID和时间排序,确保行顺序正确 | sort by OperationId, TimeGenerated asc // 合并同一关联ID下的所有消息行 | summarize FullErrorMessage = strcat_array(make_list(Message), "\n") by OperationId, TimeGenerated, Level
无关联ID时基于内容和时间合并
如果没有关联标识,可通过错误起始标记和时间窗口分组:
YourLogTable | where TimeGenerated between (ago(2h) and now()) // 标记错误起始行(比如以ERROR开头) | extend IsErrorStart = Message startswith "ERROR:" // 序列化行顺序,生成错误组ID | serialize | extend ErrorGroupId = row_cumsum(iff(IsErrorStart, 1, 0)) // 合并同一错误组内的所有行 | summarize FullErrorMessage = strcat_array(make_list(Message), "\n") by ErrorGroupId, bin(TimeGenerated, 1m)
注意事项
- 多行识别规则必须匹配你的日志格式,否则会出现合并错误或漏合并。
- 查询阶段合并大时间范围的日志时,建议缩小时间窗口或添加过滤条件,避免性能问题。
- 结构化日志(如JSON格式)比纯文本日志更容易处理,优先使用结构化输出。
内容的提问来源于stack exchange,提问作者Valentin Garreau
相关产品推荐
相关产品推荐

