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ステートメントを使用するのが最善のルートでしょうか?
私は これ を含むメソッドに従いましたが、それらを機能させることができません。
@ 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""
]
]
}
この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}
うまくいかなかったパターンを試みたのを見ずに、なぜうまくいかなかったのかコメントできません。あなたが提供したパターンがサーバーまで一致することを述べたように、私はあなたのステートメントを少し修正し、残りをキャプチャするために最後に少し追加しました:
(?<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 。さまざまな状況に一致する非常に複雑なパターンを書くこともできますが、パターンが拡張されて非常に多くの異なる潜在的な一致があり、毎回チェックするのに多くの力が必要になるため、これは理想的ではないと思います。
お役に立てば幸いです。
オプションの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}")?