在Logstash中使用Grok过滤日志的字段提取优化问题
优化Grok日志过滤方案:拆分独立字段+减少GREEDYDATA依赖
我来帮你搞定这个Grok过滤的问题!你的核心需求是把CRON JOB ID、CUSTOMER ID这些字段拆成独立项,同时减少对GREEDYDATA的依赖——毕竟这家伙用多了容易搞砸精确匹配。咱们一步步来优化:
问题分析
你的原日志里有几个关键特征需要精准处理:
- 开头的固定格式(级别、JVM信息、时间戳)
- 隐藏的ANSI终端颜色转义码(比如
\u001b[m\u001b[32m) - 任务执行器的标识内容
- 末尾的CRON任务属性列表
原方案用了两次GREEDYDATA,导致中间内容被模糊捕获,无法拆分出需要的独立字段。下面是针对性的优化方案:
优化后的Grok模式
%{LOGLEVEL:level} \| jvm %{INT:jvm_id} \| %{WORD:thread} \| %{TIMESTAMP_ISO8601:timestamp} \| (?:\x1b\[[0-9;]*m)+%{LOGLEVEL:inner_level} \[%{DATA:task_executor} \[%{INT:task_id}\]\] \[%{WORD:action}\] CRON JOB ID : %{DATA:cron_job_id}, ACTION : %{DATA:action_name} , CUSTOMER ID : %{DATA:customer_id} , EMAIL ADDRESS : %{DATA:email_address} , SCHEDULE : %{DATA:schedule} , MESSAGE : %{GREEDYDATA:message}
模式拆解说明
- 开头固定格式:用精确匹配替代第一个GREEDYDATA,提取
level、jvm_id、thread,并使用预定义的TIMESTAMP_ISO8601直接捕获时间戳(比手动拼接年/月/日更可靠) - ANSI转义处理:
(?:\x1b\[[0-9;]*m)+是一个非捕获组,专门匹配日志里的终端颜色码,不会生成多余字段 - 任务执行器信息:精准捕获
inner_level、task_executor、task_id和action字段 - CRON属性拆分:逐个匹配每个CRON属性,把
cron_job_id、customer_id、email_address等直接提取为独立字段,最后用一次GREEDYDATA捕获消息内容(这里是安全的,因为它在最后,不会吞掉前面的内容)
测试后输出示例
{ "level": "INFO", "jvm_id": "1", "thread": "main", "timestamp": "2013/04/05 01:08:47.048", "inner_level": "INFO", "task_executor": "TaskExecutor-master-2443-ProcessTask", "task_id": "31111111112", "action": "b2cConfirmationAction", "cron_job_id": "101AA1C", "action_name": "ConfirmationAction", "customer_id": "000001111111", "email_address": "abc@gmail.com", "schedule": "Every 1 week", "message": "Execution started for action ConfirmationAction" }
额外建议
如果后续需要把timestamp转换为Logstash的@timestamp字段,可以在Grok过滤后添加date插件配置:
date { match => [ "timestamp", "yyyy/MM/dd HH:mm:ss.SSS" ] target => "@timestamp" }
内容的提问来源于stack exchange,提问作者Naved Ali
相关产品推荐
相关产品推荐

