如何编写带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
相关产品推荐
相关产品推荐

