如何调试日期的匹配?

时间:2015-01-30 16:08:34

标签: jodatime logstash

我正在匹配

等事件
[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记录事件的时间。

你能发现问题,还是有一种聪明的方法来调试这种情况?

2 个答案:

答案 0 :(得分:6)

日期过滤器完成的时间戳匹配不是基于正则表达式或grok表达式。这就是为什么把SYSLOG5424SD放在那里不起作用的原因。除filter documentation中列出的几个特殊情况外,您只能使用Joda-Time库识别的令牌。请参阅joda.time.format.DateTimeFormat类的文档。

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

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

同样,Joda-Time模式不是正则表达式,因此为了匹配方括号文字,您不需要做任何特殊的事情。引用Joda-Time文档:

  

模式中的任何字符都不在[' a' ...' z']和[' A' ..&#39范围内; Z']将被视为引用文本。例如,像':','。',' ','#'和'?'即使它们没有包含在单引号内,也会出现在生成的时间文本中。

答案 1 :(得分:2)

关于你的第二个问题:是的,有一种聪明的方法来调试这种情况,有一个在线grok调试器(http://grokdebug.herokuapp.com/)和一个joda时间调试器,我创建的灵感来自第一个:{{ 3}}

更新:由于鼓励用户迁移到Java 8的DateTime API,我将此debuggung Web应用程序迁移到使用Java 8的DateTime API,而不再使用JodaTime。