ELK: logstash gork filter 多个模式(pattern)匹配规则语法和多行日志匹配设置

项目里用logstash分析日志,由于有多种模式(pattern)需要匹配,网上搜了很多示例,发现这些都是老的写法,都会报错,后来查阅了官方文档,才发现,新版本只支持新语法。

错误的语法:

复制代码
        if "batch-trans" in [tags] {
            grok {
                 match => [
                     "message","\[(?<logDate>[\d{4}(\-|\/|.)\d{1,2}\1\d{1,2}\s+d{1,2}:d{1,2}:d{1,2}]*)\]\s+\[(?<mainJobId>(?:[+-]?(?:[0-9]+)))\-(?<subJobId>(?:[+-]?(?:[0-9]+)))\-(?<shardingId>(?:[+-]?(?:[0-9]+)))\]\s+\[(?<traceId>[^\]]*)\]\s+\[(?<jobName>[^\]]*)\]\s+\[(?<threadId>[^\]]*)\]\s+\[(?<zoneId>[^\]]*)\]\s+\[(?<traceType>[^\]]*)\]\s+\[(?<cost>[^\]]*)\]\s+\[(?<splitZoneId>[^\]]*)\]\s+\[(?<url>[^\]]*)\]\s+\[(?<subJobId>[^\]]*)\](?<msg>.*)",
                     "message","\[(?<logDate>[\d{4}(\-|\/|.)\d{1,2}\1\d{1,2}\s+d{1,2}:d{1,2}:d{1,2}]*)\]\s+\[(?<mainJobId>(?:[+-]?(?:[0-9]+)))\-(?<subJobId>(?:[+-]?(?:[0-9]+)))\]\s+\[(?<traceId>[^\]]*)\]\s+\[(?<jobName>[^\]]*)\]\s+\[(?<threadId>[^\]]*)\]\s+\[(?<zoneId>[^\]]*)\]\s+\[(?<traceType>[^\]]*)\]\s+\[(?<cost>[^\]]*)\]\s+\[(?<splitZoneId>[^\]]*)\]\s+\[(?<url>[^\]]*)\]\s+\[(?<subJobId>[^\]]*)\](?<msg>.*)",
				]
			}
		}

正确的语法:

复制代码
filter {
	if "accounting-log" in [tags] {
		 grok {
			   match => {
				"message" => [
					"^\[(?<log-time>[\s\S]*)\]\s+%{LOGLEVEL:log-level}\s\[%{DATA:trace-id}\]\s\[%{DATA:thread-name}\s*\]\s\[%{DATA:logger}\s*: %{NUMBER:line-no}\] \[%{DATA:zone-id}\]\sJob-Sharding-Params: jobId=%{NUMBER:job-id}, transCode=*%{NUMBER:trans-code}, shardingId=*%{NUMBER:sharing-id}, shardingTable=*%{DATA:sharding-table}, JobParameters=\{%{GREEDYDATA:job-parameters}\}",
					"^\[(?<log-time>[\s\S]*)\]\s+%{LOGLEVEL:log-level}\s\[%{DATA:trace-id}\]\s\[%{DATA:thread-name}\s*\]\s\[%{DATA:logger}\s*:\s*%{NUMBER:line-no}\]\s\[%{DATA:zone-id}\]\s%{GREEDYDATA:msg}"
				]
		   }
		}
	}
    }
}

注意,先后顺序很重要,上面示例中,如果排错了顺序,后面规则永远匹配不到,都会被前面的规则抢先了。

为方便大家拿来主义,上面示例对应的logback配置如下:

复制代码
logback:
	<property name="NORMAL_FILE_LOG_PATTERN"
			  value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] %5p [%0.16X{traceId}] [%-12.12t] [%-40.40logger{39}:%3L] [%0.2X{zoneId}] %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" />

gork:
"^\[(?<log-time>[\s\S]*)\]\s+%{LOGLEVEL:log-level}\s\[%{DATA:trace-id}\]\s\[%{DATA:thread-name}\s*\]\s\[%{DATA:logger}\s*:\s*%{NUMBER:line-no}\]\s\[%{DATA:zone-id}\]\s%{GREEDYDATA:msg}"

另外,为了让一条日志包含多行(如,异常日志),应该做如下配置:

复制代码
input{
    file {
        path => "/logs/accounting-service.log"
        type => "system"
        tags => ["accounting-log"]
        codec => multiline {
            pattern => "^(\[.+\] )" #这儿就是说多行要匹配到一行开头:[******]跟随一个空格的形式
            negate => true
            what => "previous"
            auto_flush_interval => 2 #这行非常重要,就是2秒内如果没新的内容,就认为这条日志结束了,否则最后一条日志永远就是要等到有下一条日志进来才会被采集
        }
        start_position => "beginning"
    }
}

参考官方文档:(搜索"multiple patterns")
https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html

相关推荐
沙漠之主3 分钟前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
朝朝辞暮i14 分钟前
C++ 第 29 课:回调函数 Callback
开发语言·c++·算法
FPGA小徐14 分钟前
PA1 基础设施(2)深度解析:NEMU 中 ITRACE、MTRACE、FTRACE、IRINGBUF、ETRACE、DIFFTEST 全解析
java·服务器·网络
笨笨饿17 分钟前
140_AI新手村MCP与Skills是干嘛的
开发语言·人工智能·python·stm32·单片机·嵌入式硬件·物联网
YOLO数据集集合41 分钟前
EvoAgent:面向PR研发治理的自进化Multi-Agent Harness系统
java·开发语言·目标检测·agent·自进化
知行EDI1 小时前
知行之桥 MaBang 端口使用指南——Create Order 订单创建篇
java·服务器·数据库
笑鸿的学习笔记1 小时前
C++笔记之大块顺序写
java·c++·笔记
打工仔折腾 AI1 小时前
从 Demo 到生产级 Agent:8 个关键设计机制与 Python 实现拆解
java·jvm·人工智能·后端·python·langchain·ai agent 实战
殷色玫瑰2 小时前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·linux·c语言·c++
code_slave(码畜)2 小时前
微服务架构落地:基础服务 —— 报表服务(中篇:元数据、查询引擎、缓存与权限落地)
spring boot·spring cloud·缓存·微服务·架构