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

在Logstash中使用Grok过滤日志的字段提取优化问题

优化Grok日志过滤方案:拆分独立字段+减少GREEDYDATA依赖

我来帮你搞定这个Grok过滤的问题!你的核心需求是把CRON JOB ID、CUSTOMER ID这些字段拆成独立项,同时减少对GREEDYDATA的依赖——毕竟这家伙用多了容易搞砸精确匹配。咱们一步步来优化:

问题分析

你的原日志里有几个关键特征需要精准处理:

  1. 开头的固定格式(级别、JVM信息、时间戳)
  2. 隐藏的ANSI终端颜色转义码(比如\u001b[m\u001b[32m)
  3. 任务执行器的标识内容
  4. 末尾的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:21:40