Logstash Grok 模式

Logstash Grok 模式

首先,我對此表示歉意,我在正規表示式方面非常糟糕,並嘗試編寫自訂模式(因為我無法在現有的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" }
}

}

我不確定它是否正確,但像往常一樣它不起作用。

答案1

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

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

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

需要注意的重要事項:

  • 這些表達式中的管道字元是邏輯或,需要轉義
  • 正如 @tigran 所指出的:您需要在 SVN 版本上使用加號來表示「一個或多個」數字
  • 您的 SVN_TIMESTAMP 模式非常複雜,但似乎不太正確。至少您需要轉義括號才能匹配。

我建議您將您的輸入和我的模式放入https://grokdebug.herokuapp.com/——這將使您能夠逐漸將其增強到您真正需要的程度。

相關內容