我刚开始使用神交的logstash,我试图用神交过滤器来分析我的日志文件。我的logline是类似下面
2017年3月30日13时26分13秒[00089] TIMER XXX.TimerLog:entType [组织],queueType [输出],memRecno = 446323718,audRecno = 2595542711,经过的时间= 998ms
我想只捕捉初始日期/时间戳记,entType [organization]
和elapsed time = 998ms
。
然而,它看起来像我要为在该行的每一个字和数量相匹配的模式。有没有一种方法,我可以跳过它?我想看看无处不在,但无法找到任何东西。请帮助。
按照查尔斯·达菲的评论。
有2种方式这样做的:在GREEDYDATA
方式(?:.*)
:
grok {
match => {"message" => "^%{DATE_US:dte}\s*%{TIME:tme}\s*\[%{GREEDYDATA}elapsed time\s*=\s*%{BASE10NUM}"
}
或者,告诉它忽略了一个比赛,并期待在列表中的下一个。
grok {
break_on_match => false
match => { "message" => "^%{DATE_US:dte}\s*%{TIME:tme}\s*\[" }
match => { "message" => "elapsed time\s*=\s*%{BASE10NUM:elapsedTime}"
}
然后,您可以重新加入日期和时间成一个单一的领域,将其转换为一个时间戳。
正如查尔斯·达菲建议,你可以简单地绕过数据则不需要。
您可以使用.*
做到这一点。
下面会产生你想要的输出,
%{DATE_US:dateTime}.*entType\s*\[%{WORD:org}\].*elapsed time\s*=\s*%{BASE10NUM}
说明:
\s*
匹配空格字符。\[
被绕过[
字符。%{WORD:org}
定义一个单词边界,并将其放置在一个新的领域org
输出
{
"dateTime": [
[
"03-30-2017"
]
],
"MONTHNUM": [
[
"03"
]
],
"MONTHDAY": [
[
"30"
]
],
"YEAR": [
[
"2017"
]
],
"org": [
[
"organization"
]
],
"BASE10NUM": [
[
"998"
]
]
}