我正在匹配
等事件[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记录事件的时间。
你能发现问题,还是有一种聪明的方法来调试这种情况?
答案 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。