2017-04-05 77 views
1

我有一些RFC-5424格式的系統日誌消息。Logstash grok過濾器比Java正則表達式模式匹配慢

我使用logstash grok過濾器和java正則表達式模式匹配來解析日誌。我正在比較兩種方法的相同輸入。

java的正則表達式語法分析從stdin讀取輸入並在單個線程中運行。以便所有的消息都在一個批次處理

Logstash還讀取從stdin輸入和我已經配置工作線程一個和管道批量大小等於消息的數目。

我可以看到,Java正則表達式解析比神交過濾器快得多。

觀察:

輸入 - 300K的消息

Java的正則表達式 - 1500個米利斯

Logstash神交 - 每次超過1分鐘。

爲什麼Logstash神交比Java正則表達式這個慢得多。 Grok也應該在後端使用java正則表達式。

回答

0

沒有更多的細節,很難說出爲什麼Grok或Java中的特定模式更慢或更快,但有一點是肯定的:正則表達式引擎不同

Java使用一種特殊的java.util.regex模塊和Grok uses Oniguruma正則表達式引擎。他們可以處理相同的模式並按照自己的方式進行串聯。

+0

在神交過濾器,我使用我使用的格式**(?模式在這裏)**用我的Java模式,相同的正則表達式。在java中,我使用緩衝讀取器從標準輸入讀取時逐行解析輸入。在logstash中,我使用** stdin {} **進行輸入。 在這兩次嘗試中,我放棄輸出。 **我認爲有一個原因可能是grok是使用JRuby和Ruby實現的。這可能是緩慢的原因嗎?** –

+0

@Rahulkhandelwal:這*可能是原因,但它不一定。正則表達式引擎在它們的行爲,它們支持的語法和性能/穩定性方面*有所不同。 –

+0

「*我還會提及我們在JRuby中多次發現 的性能的真相:如果您沒有快速的核心類,那麼您不需要 具有快速的Ruby實現。 「VE調查歷年來可以追溯​​到核心類 實現,這在大多數的實現都已經寫在 像C或Java中的‘快’的語言(Rubinius的有C++和Ruby 爲最核心的類,但具有。重點紅寶石)等一大批在Ruby中 性能較差的系統都可以直接歸因於濫用 或緩慢實施的核心方法*」 –