Logstash
Logtash grok / 多行混淆
我的真實模式更複雜,但我試圖將問題歸結為核心問題。我不明白的東西。請在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
在我的測試中也可以看到,它似乎確認該行在傳遞到過濾器時是一個完全空的字元串(沒有換行符或任何其他終止字元)。