我的真实模式比较复杂,但我试图将问题归结为核心问题。 我不明白的东西。 请在http://grokconstructor.appspot.com/do/match上试试
我试图匹配以下几行:
Start-Date: 2017-08-07 06:48:12 End-Date: 2017-08-07 06:48:12 Start-Date: 2017-08-07 12:55:16 End-Date: 2017-08-07 12:56:01
使用其他模式:
DATE_EU2 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[\s]+?%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}? DATE_COMB %{DATE_EU2}?%{DATE_EU}?%{DATE_US}?
以下主要模式:
Start-Date: %{DATE_COMB:starttime}\nEnd-Date: %{DATE_COMB:endtime}
多线filter:
^\n (negated)
运行,你应该(希望!)得到:
Start-Date: 2017-08-07 06:48:12 End-Date: 2017-08-07 06:48:12 Start-Date: 2017-08-07 12:55:16 End-Date: 2017-08-07 12:56:01 MATCHED starttime 2017-08-07··06:48:12 endtime 2017-08-07··06:48:12 after match: Start-Date: 2017-08-07 12:55:16 End-Date: 2017-08-07 12:56:01
所以它是匹配的第一个logging,但不匹配第二个。 如果我添加一个'\ z'到主要模式的结尾,那么它将匹配第二个logging,但不是第一个。 所以显然把整个事情看作一条线。 但为什么? 我的多行筛选器指出,如果一行不是以换行符开头,它是前一个logging的一部分,对吗? 那么应该在中间留出一个空白的行,显然是从一个换行开始的,因此应该包含一个单独的事件,不是吗?
任何指针感激地接受。
input
Start-Date: 2017-08-07 06:48:12 End-Date: 2017-08-07 06:48:12 Start-Date: 2017-08-07 12:55:16 End-Date: 2017-08-07 12:56:01
多线滤波器= ^\n
(否定)
多行筛选器将依次查看每行,以查看应该合并的内容。
First line starts with `^Start-Date` (merged) Second line starts with `^End-Date` (merged) Third line is blank (merged, unless logstash skips blank lines) Fourth line starts with `^Start-Date` (merged) Fifth line starts with `^End-Date` (merged)
试图匹配一个\n
,特别是在一行的开始是没有意义的。
你最好匹配^End-Date:
并与前一个合并。 (或者如果一个事件有更多的行,并且总是以Start-Date:
,匹配并且否定。
根据评论和Grok构造函数进行testing编辑。
如果使用空白行作为logging分隔符更有意义,则^\z
或^\Z
似乎可以正常工作。 \Z
忽略任何最后的终止符,但看到\z
也在我的testing工作,似乎确认,行,传入filter,是一个完全空的string(没有换行符或任何其他终止字符)。