如何调试日期的匹配?

how to debug the matching of the date?

我正在匹配

等事件
[Sun Jan 11 10:43:35 2015][3205.51466981] user idp : testing 10.234.22.220 (10.234.22.220) [61673782]

%{SYSLOG5424SD:timestamp}%{GREEDYDATA}user %{WORD:user} : testing %{HOST:ip}

有效,我在elasticsearch/kibana中看到了各个字段。具体来说,上例中的 timestamp[Sun Jan 11 10:43:35 2015]

匹配

我现在想将此匹配与 date 一起使用,以便获得正确的 @timestamp

我尝试在 filter

中使用
    date
    {
      match =>  [ "timestamp", "SYSLOG5424SD" ]
    }

但这会使 logstash 崩溃,并显示建议提交错误报告的输出 - 我打开了 a ticket

与此同时,我尝试通过

明确匹配模式
    date
    {
      match =>  [ "timestamp", "\[EEE MMM dd HH:mm:ss y\]" ]
    }

如您所料 - 它永远不会匹配,@timestamp 设置为 logstash 记录事件的时间。

你能找出问题所在吗,或者有调试此类情况的巧妙方法吗?

日期过滤器完成的时间戳匹配不是基于正则表达式或 grok 表达式。这就是为什么将 SYSLOG5424SD 放在那里不起作用的原因。除了 filter documentation you can only use tokens recognized by the Joda-Time library. See the documentation of the joda.time.format.DateTimeFormat class.

中列出的几个特殊情况

您非常接近正确 - 只是不要避开方括号:

date {
  match => ["timestamp", "[EEE MMM dd HH:mm:ss y]"]
}

同样,Joda-Time 模式不是正则表达式,因此要匹配方括号文字,您无需执行任何特殊操作。引用 Joda-Time 文档:

Any characters in the pattern that are not in the ranges of ['a'..'z'] and ['A'..'Z'] will be treated as quoted text. For instance, characters like ':', '.', ' ', '#' and '?' will appear in the resulting time text even they are not embraced within single quotes.

关于你的第二个问题:是的,有一个聪明的方法来调试这种情况,有一个在线 grok 调试器(http://grokdebug.herokuapp.com/), and a joda time debugger, I created inspired by the first one: https://java-time-parse-debugger.herokuapp.com/

更新:由于鼓励用户迁移到 Java 8 的 DateTime API,我迁移了此 debuggung 网络应用程序以使用 Java 8 的 DateTime API,不再有 JodaTime。