Logstash

Logstash Grok 模式

  • March 4, 2015

首先我為此道歉,我在正則表達式方面很糟糕,並嘗試編寫自定義模式(因為我無法在現有的 grok 模式中找到一些東西,或者我可能遺漏了一些東西)來解析 svn 日誌的格式

r24|prashant|2015-02-26 12:38:04 -0800 (Thu, 26 Feb 2015)|33|Log: ABC-123 / Initial version||A   test/log_testing1 A   test/log_testing2 A   test/log_testing3 A   test/log_testing4 A   test/log_testing5 \n

所以它的格式為

$REVISION:$USER ID:$DATE:$CHECKED IN MESSAGE:$FILE CHECKED IN 

所以我寫了一些自定義模式

SVN [r0-9]
SVN_TIMESTAMP %{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?  (%{DAY}, %{MONTHDAY} %{MONTH} %{YEAR})

我的 logstash-conf 對於過濾器部分看起來像這樣

filter {
 grok {
 match => { "message" => "%{SVN:revision}|%{USERNAME:username}|%{SVN_TIMESTAMP:svntimestamp}|%{GREEDYDATA:syslog_message}||%{GREEDYDATA:syslog_message" }
}

}

我不確定它是否正確,但像往常一樣它不起作用。非常感謝任何幫助

這是一個更簡單的模式版本,可以幫助您入門:

(?<SVN>[0-9]+)\|%{USERNAME:username}\|(?<SVN_TIMESTAMP>[^\|]+)\|%{GREEDYDATA:syslog_message}

為簡單起見,我沒有使用命名模式,時間戳也不是很具體,但這應該更容易修復。

需要注意的重要事項:

  • 管道字元在這些表達式中是邏輯或,需要轉義
  • 正如@tigran 指出的那樣:SVN 修訂版上的“一個或多個”數字需要加號
  • 您的 SVN_TIMESTAMP 模式非常複雜,但似乎不太正確。至少您需要轉義括號以匹配。

我建議你把你的輸入和我的模式放到https://grokdebug.herokuapp.com/中——這樣你就可以逐漸將它增強到你真正需要的東西。

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