如何调试日期的匹配?
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。
我正在匹配
等事件[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。