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

在Logstash中格式化块数据并使用Grok模式按起止时间过滤的咨询

解决方案

第一步:流式数据的多行聚合预处理

你的日志以固定分隔线拆分独立任务块,首先需要将分散的行聚合为单条完整事件,否则Grok无法匹配跨行字段。
以常用的Logstash流式处理为例,多行配置参考:

input {
  # 此处替换为你的实际流式输入源,比如kafka、实时文件等
  file {
    path => "/path/to/your/logfile.log"
    codec => multiline {
      pattern => "^\+{46}$"
      negate => true
      what => "previous"
      auto_flush_interval => 5
    }
  }
}

规则会自动把两个分隔线中间的所有行拼接为一个事件,超过5秒没收到下一个分隔线也会自动输出当前块,适配流式场景的延迟要求。

第二步:Grok匹配提取规则

针对你的日志结构,支持同时覆盖成功/失败场景的Grok模式如下,可直接提取所有需要的字段:

\+{46}\nName: %{DATA:task_name}\n~{46}\nBegin Date: %{DATA:begin_date}\nBegin Time: %{DATA:begin_time}\n\nActivity\n~{46}\n(?<activity_log>(?:.|\n)*?)\n~{46}\n\nResult\n~{46}\n%{DATA:result_msg} %{WORD:exec_status}(\n(?<error_info>(?:.|\n)*?))?\nEnd Date:\s*%{DATA:end_date}\nEnd Time:\s*%{DATA:end_time}\nExecuted by: %{DATA:executor}\n\+{46}

提取字段说明:

  • 基础字段:task_name任务名、begin_date开始日期、begin_time开始时间、activity_log活动区全量日志、executor执行人
  • 核心状态字段:exec_status执行状态,返回Completed/Failed、end_date结束日期、end_time结束时间
  • 异常字段:error_info仅执行失败时返回,包含所有报错信息和堆栈内容

第三步:按时间过滤实现

把提取到的begin_date和begin_time拼接为完整时间戳,转换成标准时间格式后即可直接按范围过滤。
实时流式过滤可直接在处理阶段加判断,示例:

filter {
  grok {
    match => { "message" => "上文的Grok匹配规则" }
  }
  # 拼接开始时间为标准格式
  mutate {
    add_field => { "begin_timestamp" => "%{begin_date} %{begin_time}" }
  }
  date {
    match => [ "begin_timestamp", "MM/dd/yyyy HH:mm:ss" ]
    target => "begin_timestamp"
  }
  # 示例过滤:仅保留2024年1月1日之后执行的任务,可按需修改时间范围
  if [begin_timestamp] < "2024-01-01T00:00:00.000Z" {
    drop {}
  }
}

如果使用Fluentd、Elasticsearch摄入管道等其他组件,逻辑完全一致,先做多行聚合再套用上述Grok规则即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:42:02