2016-09-23 14 views
0

我在Grok中有一個代碼,它捕獲消息,並且如果它們符合給定條件,它們會得到一個標記。Grok中的正則表達式有時會捕獲值有時不是

我的問題是,有時候這個過濾器在測試時工作,有時候不會。有問題的正則表達式如下:

^(?!(?:\d\d\d\d-\d\d-\d\d.\d\d:\d\d:\d\d)).*$ 

此行檢查如果給定的消息不具有給定時間戳格式開始。換句話說:如果給定的消息不是以這個時間戳開始的,那麼它會得到一個標籤。

你可以用這個在線應用測試它自己:http://grokconstructor.appspot.com/do/match#result

對於這些測試值,該regepx捕捉符合條件的所有消息,因此兩行以「測試」以綠色突出顯示:

test 
2016-09-23 18:26:49,714 
2016-09-23 18:26:40,244 
test 

但是它抓住了第一次約會時輸入的是這樣的:

2016-09-23 18:26:49,714 
2016-09-23 18:26:40,244 
test 

我想了解世界衛生大會t是這種行爲背後的原因,我怎麼能阻止它呢?

+0

'.'似乎匹配那個單獨的空間@WiktorStribiżew – revo

+0

[這是不可重複的] – revo

+0

@revo OP表示它有時會起作用。對於第二組數據,我得到:http://i.stack.imgur.com/AphzA.png – Laurel

回答

1

這似乎是,在一些消息有一個BOM(字節順序標記)的開始,我可以與神交以下正則表達式捕捉:

^(?:\xEF\xBB\xBF).*& 

我可以在剪貼板上保留這個標記,但是看起來像StackOwerflow會將它剪掉,這就是爲什麼我的示例不適用於所有人。

2

爲什麼不以合理的方式匹配時間戳?您可以匹配多個日期格式是這樣的:

date { 
    match => [ "log_timestamp", "dd/MMM/YYYY HH:mm:ss", "dd/MMM/YYYY HH:mm:ss.SSS" ] 
    timezone => "Etc/UTC" 
    locale => "en-US" 
} 

這將匹配23/SEP/2016 15:15:00或23/SEP/2016 15:15:00.123(我們做了改變,當我們的版本)

只要它不會出現在其他地方,這應該幾乎涵蓋你。

1

我想知道是什麼原因在online tester中發生了這種行爲,但我不確定它爲什麼會發生,或者它確切地遵循了什麼樣的模式。 (我對正則表達式很熟悉,但在這裏沒有別的,如果你知道更多,請隨時在評論中說明一下。)

複製將下列內容作爲行說明:「某些日誌行要匹配「:

2016-09-23 18:26:49,714 
2016-09-23 18:26:40,244 
test 

在它說的地方‘:

^(?!(?:\d\d\d\d-\d\d-\d\d.\d\d:\d\d:\d\d)).*$ 

做與複選框不亂(我應該匹配所有的日誌文件行’,把你的正則表達式模式我不確定他們做了什麼,但他們都應該被檢查)。

點擊開始!你會得到這樣的結果,因爲在評論中提到雷沃:

works

爲了得到其他的結果,建立東西完全相同的方式(如果你只是提交它仍然應該建立正則表達式)但是將相同的正則表達式添加到「如果要使用logstash的多行篩選器請指定使用的模式」的區域。

點擊開始!你會得到這樣的結果:

fails

簡單的方法來避免這種情況是不使用Logstash's multiline filter。 (至少這是我會承擔。)

相關問題