You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:32:24