Logstash

Logtash grok / 多行混淆

  • August 8, 2017

我的真實模式更複雜,但我試圖將問題歸結為核心問題。我不明白的東西。請在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}

使用多行過濾器:

^\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

所以它匹配第一個記錄但不匹配第二個記錄。如果我在主模式的末尾添加一個 ‘\z’ ,那麼它將匹配第二條記錄但不匹配第一條記錄。因此,它顯然將整個事情視為一條線。但為什麼?我的多行過濾器指出,如果一行不以換行符開頭,它是上一條記錄的一部分,對嗎?那麼這應該在中間留下一個空白行,顯然確實以換行符開頭,因此應該包含一個單獨的事件,不是嗎?

任何指點都感激地接受。

輸入

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)

試圖匹配 a \n,尤其是在一行的開頭是沒有意義的。

您最好^End-Date:將其與以前的匹配和合併。(或者如果一個事件有更多行,並且它總是以 開頭Start-Date:,匹配它並否定。

根據 Grok 建構子的註釋和測試進行編輯。

如果使用空行作為記錄分隔符更有意義,^\z或者^\Z似乎可以工作。\Z忽略任何最終終止符,但\z在我的測試中也可以看到,它似乎確認該行在傳遞到過濾器時是一個完全空的字元串(沒有換行符或任何其他終止字元)。

引用自:https://serverfault.com/questions/867469