Logstash
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" } }
}
我不確定它是否正確,但像往常一樣它不起作用。非常感謝任何幫助
這是一個更簡單的模式版本,可以幫助您入門:
(?<SVN>[0-9]+)\|%{USERNAME:username}\|(?<SVN_TIMESTAMP>[^\|]+)\|%{GREEDYDATA:syslog_message}
為簡單起見,我沒有使用命名模式,時間戳也不是很具體,但這應該更容易修復。
需要注意的重要事項:
- 管道字元在這些表達式中是邏輯或,需要轉義
- 正如@tigran 指出的那樣:SVN 修訂版上的“一個或多個”數字需要加號
- 您的 SVN_TIMESTAMP 模式非常複雜,但似乎不太正確。至少您需要轉義括號以匹配。
我建議你把你的輸入和我的模式放到https://grokdebug.herokuapp.com/中——這樣你就可以逐漸將它增強到你真正需要的東西。