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

如何编写带if else条件的Logstash自定义Grok模式解析指定格式日志

正确的Grok规则及Logstash配置

你提供的示例日志前半段结构固定,按固定长度拆分即可,无需额外if else判断就能满足所有解析需求,规则如下:

核心Grok模式

^(?<data1>\d{11})(?<data2>\d{2})(?<data3>\d{2})(?<data4>.{2})\s+(?<data5>.*)$
各部分说明:

  • (?<data1>\d{11}):匹配前11位数字,对应data1字段
  • (?<data2>\d{2}):匹配接下来2位数字,对应data2字段
  • (?<data3>\d{2}):匹配接下来2位数字,对应data3字段
  • (?<data4>.{2}):匹配接下来2位任意字符,对应data4字段
  • \s+:匹配两段内容中间的1个或多个空白分隔符
  • (?<data5>.*):匹配行内剩余所有内容(支持空格、下划线、混合字符),对应data5字段

完整Logstash配置示例

input {
  # 自行替换为实际输入源,比如file、stdin等
  stdin {}
}
filter {
  grok {
    match => { "message" => "^(?<data1>\d{11})(?<data2>\d{2})(?<data3>\d{2})(?<data4>.{2})\s+(?<data5>.*)$" }
  }
}
output {
  # 自行替换为实际输出源,比如elasticsearch、stdout等
  stdout { codec => rubydebug }
}

异常原因说明

你之前的解析结果出现截断,大概率是匹配data5时使用了%{WORD}/%{NUMBER}这类有字符范围限制的模式,遇到空格、特殊字符就会停止匹配,替换为全匹配模式即可解决。

可选if else适配方案

如果需要兼容其他结构的日志,可以添加条件分支处理:

filter {
  # 匹配前11位为数字的日志格式
  if [message] =~ /^\d{11}/ {
    grok {
      match => { "message" => "^(?<data1>\d{11})(?<data2>\d{2})(?<data3>\d{2})(?<data4>.{2})\s+(?<data5>.*)$" }
    }
  } else {
    # 其他格式日志的解析规则,自行补充
  }
}

内容的提问来源于stack exchange,提问作者Rafianda Rafi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:15:03