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/——这将允许您逐步将其增强到您真正需要的程度。

相关内容