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

ログ行の一部が欠落している場合は、次の構文を使用できます。

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

また

(?:%{PATTERN1}|)

許可するPATTERN1 OR ''。(空の)

これを使用すると、管理するパターンを 1 つだけ持つことができます。

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

問題がある場合は%{DATA}、より制限的なパターンに置き換えてください。

この構文も使用できます(より正規表現に似ています)

(?:%{PATTERN1})?

複雑な grok パターンをデバッグするには、次のことをお勧めします。

于 2015-11-25T17:14:07.367 に答える
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 に答える