如何调试日期的匹配?

WoJ*_*WoJ 5 jodatime logstash

我正在匹配诸如的事件

[Sun Jan 11 10:43:35 2015][3205.51466981] user idp : testing 10.234.22.220 (10.234.22.220) [61673782]
Run Code Online (Sandbox Code Playgroud)

%{SYSLOG5424SD:timestamp}%{GREEDYDATA}user %{WORD:user} : testing %{HOST:ip}
Run Code Online (Sandbox Code Playgroud)

它有效,我看到elasticsearch/kibana中的各个领域.具体timestamp在上面的例子中匹配[Sun Jan 11 10:43:35 2015]

我现在想要使用这个匹配,date以便拥有正确的@timestamp.

我试过用 filter

    date
    {
      match =>  [ "timestamp", "SYSLOG5424SD" ]
    }
Run Code Online (Sandbox Code Playgroud)

但这会导致logstash崩溃,并提示输出错误报告 - 我打开了一张票.

与此同时,我尝试通过明确匹配模式

    date
    {
      match =>  [ "timestamp", "\[EEE MMM dd HH:mm:ss y\]" ]
    }
Run Code Online (Sandbox Code Playgroud)

正如您所怀疑的那样 - 它从不匹配,@timestamp设置为logstash记录事件的时间.

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

Mag*_*äck 6

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

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

date {
  match => ["timestamp", "[EEE MMM dd HH:mm:ss y]"]
}
Run Code Online (Sandbox Code Playgroud)

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

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