首先,我对此表示歉意,我的正则表达式很糟糕,并尝试编写自定义模式(因为我无法在现有的 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/——这将允许您逐步将其增强到您真正需要的程度。