5

我有这种格式的 php 日志

[Day Mon DD HH:MM:SS YYYY] [Log-Type] [client <ipv4 ip address>] <some php error type>: <other msg with /path/of/a/php/script/file.php and something else>
[Day Mon DD HH:MM:SS YYYY] [Log-Type] [client <ipv4 ip address>] <some php error type>: <other msg without any file name in it>
[Day Mon DD HH:MM:SS YYYY] [Log-Type] [client <ipv4 ip address>] <some msg with out semicolon in it but /path/of/a/file inside the message>

我试图通过logstash处理后发送到Graylog2。在这里使用这篇文章,我可以开始了。现在我想获得一些额外的字段,以便我的最终版本看起来像这样。

{
       "message" => "<The entire error message goes here>",
      "@version" => "1",
    "@timestamp" => "converted timestamp from Day Mon DD HH:MM:SS YYYY",
          "host" => "<ipv4 ip address>",
       "logtime" => "Day Mon DD HH:MM:SS YYYY",
      "loglevel" => "Log-Type",
      "clientip" => "<ipv4 ip address>",
      "php_error_type" => "<some php error type>"
      "file_name_from_the_log" => "/path/of/a/file || /path/of/a/php/script/file.php"
      "errormsg" => "<the error message after first colon (:) found>"
}

我有单个行的表达式,或者至少我认为这些应该能够解析,使用grokdebugger。像这样的东西:

%{DATA:php_error_type}: %{DATA:message_part1}%{URIPATHPARAM:file_name}%{GREEDYDATA:errormsg}
%{DATA:php_error_type}: %{GREEDYDATA:errormsg}
%{DATA:message_part1}%{URIPATHPARAM:file_name}%{GREEDYDATA:errormsg}

但不知何故,我发现很难让它适用于整个日志文件。

请问有什么建议吗?此外,不确定日志文件中是否会出现任何其他类型的错误消息。但目的是为所有人获得相同的格式。任何建议如何处理这些日志以获得上述格式?

4

2 回答 2

9

grok过滤器可以配置多种模式:

grok {
  match => [
    "message", "%{DATA:php_error_type}: %{DATA:message_part1}%{URIPATHPARAM:file_name}%{GREEDYDATA:errormsg}",
    "message", "%{DATA:php_error_type}: %{GREEDYDATA:errormsg}",
    "message", "%{DATA:message_part1}%{URIPATHPARAM:file_name}%{GREEDYDATA:errormsg}"
  ]
}

(而不是具有多个模式的单个过滤器,您可以拥有多个 grok 过滤器,但是您可能希望使用 _grokparsefailure 禁用标记tag_on_failure => []。)

于 2015-01-19T07:16:21.440 回答
9

如果您的日志行的某些部分有时丢失,您可以使用以下语法:

(?:%{PATTERN1}|%{PATTERN2})

或者

(?:%{PATTERN1}|)

允许PATTERN1 OR ''. (空的)

使用它,您可以只管理一种模式:

grok {
   match => [
      "message", "(?:%{DATA:php_error_type}: |)(?:%{DATA:message_part1}:)(?:%{URIPATHPARAM:file_name}|)%{GREEDYDATA:errormsg}",
   ]
}

如果您有问题,可以用%{DATA}更严格的模式替换。

您也可以使用这种语法(更像正则表达式)

(?:%{PATTERN1})?

要调试复杂的 grok 模式,我建议:

于 2015-11-25T17:14:07.367 回答