web-dev-qa-db-ja.com

nginxエラーログGrokパターン

grokデバッガー で解析する次のnginxエラーログメッセージを取得できません。私は使うべき愚かなトリックがあるように感じますが、それが何であるかを理解できません。

2015/03/20 23:35:52 [エラー] 8#0:* 10241823 "/ www"の存在のテストに失敗しました(2:そのようなファイルまたはディレクトリはありません)要求のロギング中に、クライアント:201.45.203.78、サーバー:$ domain、リクエスト:「GET/ritikapuri_」

これまでの私のGrokパターンは次のとおりです。

(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER}: %{GREEDYDATA:errormessage} client: %{IP:client}

このパターンでは「サーバー」セクションに移動しますが、残りの部分を解析することができず、理由がわかりません。

別の%{GREEDYDATA}パターンを使用してログの最後を取得すると、上記と一致しないログが解析されず、_grokparsefailureが発生することがあります。

Nginxでログメッセージのさまざまなバリエーションをトラップするifステートメントを使用するのが最善のルートでしょうか?

私は これ を含むメソッドに従いましたが、それらを機能させることができません。

7
jmreicha

@ dr01の回答を使用して、nginxのエラーログのレシピを改善しました1.15通知形式を使用-この回答は、HTTPバージョンとHTTPメソッドおよびリクエストを分離します。

(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER:threadid}\: \*%{NUMBER:connectionid} %{GREEDYDATA:message}, client: %{IP:client}, server: %{GREEDYDATA:server}, request: "(?:%{Word:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion}))", Host: %{GREEDYDATA:Host}

サンプル文字列

2015/03/20 23:35:52 [error] 8#0: *10241823 testing "/www" existence failed (2: No such file or directory) while logging request, client: 201.45.203.78, server: $domain, request: "GET /dsfadsfe HTTP/1.1", Host: "localhost:8080"

grokデバッガ からの出力

{
  "timestamp": [
    [
      "2015/03/20 23:35:52"
    ]
  ],
  "severity": [
    [
      "error"
    ]
  ],
  "pid": [
    [
      "8"
    ]
  ],
  "threadid": [
    [
      "0"
    ]
  ],
  "connectionid": [
    [
      "10241823"
    ]
  ],
  "message": [
    [
      "testing "/www" existence failed (2: No such file or directory) while logging request"
    ]
  ],
  "client": [
    [
      "201.45.203.78"
    ]
  ],
  "server": [
    [
      "$domain"
    ]
  ],
  "verb": [
    [
      "GET"
    ]
  ],
  "request": [
    [
      "/dsfadsfe"
    ]
  ],
  "httpversion": [
    [
      "1.1"
    ]
  ],
  "Host": [
    [
      ""localhost:8080""
    ]
  ]
}
3
realdubb

このgrokレシピは、serverフィールドの値に関係なく機能します。

(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER:threadid}\: \*%{NUMBER:connectionid} %{GREEDYDATA:errormessage}, client: %{IP:client}, server: %{GREEDYDATA:server}, request: %{GREEDYDATA:request}
2
dr_

うまくいかなかったパターンを試みたのを見ずに、なぜうまくいかなかったのかコメントできません。あなたが提供したパターンがサーバーまで一致することを述べたように、私はあなたのステートメントを少し修正し、残りをキャプチャするために最後に少し追加しました:

(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER}: %{GREEDYDATA:errormessage},\ client: %{IP:client}, server: \$domain, request: \"%{Word:method} %{URIPATH:path}\"

あなたのGREEDYDATAの後に、コンマを追加したことに注意してください。おそらく、それをキャプチャーされたデータに含めたくないので、メッセージのクライアント部分の前に常に使用されると想定しています。 $をエスケープするには$の前に\が必要なので、$ domainのマッチングに問題があったと思います。

これはgrokデバッガーでは機能しますが、logstashでは機能しないのではないかと思います。logstashがパターンでニースを再生するには(つまり、すべてのインスタンスを変更するために)、すべてのスペースもエスケープする必要があります。 "から"\")

再。 :nginxでさまざまなバリエーションのログメッセージをトラップするifステートメントを使用するのに最適なルートはどれですか?

私はあなたが何を求めているのか正確にはわかりませんが、あなたのフィルタの周りにifステートメントを置くことができますか、またはこの answer のように、フィルタの一部です。タグを付ける方法がわかれば、タグでも同じことができます。これらの2つのオプションは、各行に使用される処理能力の点でおそらく「最良」です。これは、各イベントを各パターンに対してチェックする必要があるため、このようなものよりも作業量が少ないと思います answer 。さまざまな状況に一致する非常に複雑なパターンを書くこともできますが、パターンが拡張されて非常に多くの異なる潜在的な一致があり、毎回チェックするのに多くの力が必要になるため、これは理想的ではないと思います。

お役に立てば幸いです。

2
Rumbles

オプションのpstreamおよびreferrerフィールドが追加されたGrokエラーパターン。 nginx:1.17.でテスト

(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER:threadid}\: \*%{NUMBER:connectionid} %{GREEDYDATA:message}, client: %{IP:client}, server: %{GREEDYDATA:server}, request: "(?:%{Word:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion}))"(, upstream: "%{GREEDYDATA:upstream}")?, Host: "%{DATA:Host}"(, referrer: "%{GREEDYDATA:referrer}")?
0
cdalxndr