【问题标题】:Grok pattern from line - custom date来自行的 Grok 模式 - 自定义日期
【发布时间】:2021-09-12 07:04:11
【问题描述】:

我正在尝试使用 grok 模式从以下内容中获取字段。对此有何帮助,尤其是自定义日期?

0E7 10JUN21 23:37:53.8 轨道 1 EZ:100 EX:72 速度:36 mph

我需要获取字段;

“日期” “时间” “轨道 1” “EZ” “前任” “速度”

我试图获取日期模式但没有成功

【问题讨论】:

  • 您尝试过的模式是什么?您的日志行是否始终采用相同的格式?如果是这样,您可以使用 dissect 来解析它。请使用您尝试过的模式更新您的问题。
  • 我已经用 0E7 %{WORD:date} %{TIME:time} 对它进行了剖析,它给了我作为字符串的日期,但是当我尝试将它变异到日期时,它会出现问题 n 失败.问题是大写月份,即 JUN。过滤器 %{DATE:date} 不起作用
  • 查看我关于如何解析此日期的答案,如果您需要其他字段的帮助,请使用每个字段的预期字段名称和值更新您的问题。

标签: logstash logstash-grok


【解决方案1】:

您将需要一个自定义 grok 来获取分隔字段中的日期、月份和年份,然后您需要将月份字段大写,然后添加一个包含完整日期字符串的新字段以在日期过滤器中使用。

要将您的日期 10JUN21 解析为单独的字段,您可以使用自定义 grok 模式。

(?<day>[0-9]{2})(?<month>[A-Z]{3})(?<year>[0-9]{2})

因此,考虑到消息 0E7 10JUN21 23:37:53.8 Track 1 EZ: 100 EX: 72 Speed: 36 mph 并从中提取 datetime 并进行转换以解析数据,您将需要以下配置。

filter {
    grok {
        match => {
            "message" => "0E7 (?<day>[0-9]{2})(?<month>[A-Z]{3})(?<year>[0-9]{2}) %{TIME:time} %{GREEDYDATA}"
        }
    }
    mutate {
        capitalize => ["month"]
        add_field => { "datestring" => "%{month} %{day} %{year} %{time}"}
    } 
    date {
        match => ["datestring", "MMM dd yy HH:mm:ss.S"]
        remove_field => ["day","month","year","time"]
    }
}

这将为您提供以下结果:

{
    "@timestamp" => 2021-06-11T02:37:53.800Z,
       "message" => "0E7 10JUN21 23:37:53.8 Track 1 EZ: 100 EX: 72 Speed: 36 mph",
    "datestring" => "Jun 10 21 23:37:53.8"
}

如您所见,@timestamp 字段具有您的日期字符串的值,但相对于 UTC,因为 @timestamp 字段使用 UTC。

【讨论】:

  • 完美!。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多