nginxアクセスログには、ユーザーアクセス要求の詳細情報が記録されます。 nginxアクセスログを解析して、ビジネスを監視および分析できます。 このトピックでは、正規表現またはGrok関数を使用してnginxアクセスログを解析する方法について説明します。
構文解析メソッドParsing methods
Simple Log Serviceでは、正規表現またはGrok関数を使用してnginxログを解析できます。
正規表現を使用します。
正規表現に慣れていない場合、正規表現を使用してログを解析するのは難しく、非効率的で、時間がかかる場合があります。 したがって、正規表現の代わりにGrok関数を使用してログを解析することをお勧めします。 正規表現の詳細については、「正規表現」をご参照ください。
(推奨) Grok関数を使用します。
正規表現と比較して、Grok関数は学習しやすいです。 さまざまなGrokパターンのフィールドタイプに精通している場合は、この関数を使用してログを解析できます。 Grok関数は、柔軟性、効率性、費用対効果、および学習曲線の点で正規表現よりも優れています。 Simple Log Serviceは、データ変換用の400 Grokパターンをサポートしています。 この関数を使用してログを解析することを推奨します。 Grokパターンの詳細については、「Grokパターン」をご参照ください。
正規表現とGrok関数を組み合わせて、ログを解析できます。
正規表現またはGrok関数をカスタマイズして、カスタム形式のnginxログを解析できます。
正規表現を使用して、成功ステータスコードを含むnginxアクセスログを解析する
次の例は、正規表現を使用して、成功ステータスコードを含むnginxアクセスログを解析する方法を示しています。
生のログエントリ
__source__: 192.168.0.1 __tag__:__client_ip__: 192.168.254.254 __tag__:__receive_time__: 1563443076 content: 192.168.0.2 - - [04/Jan/2019:16:06:38 +0800] "GET http://example.aliyundoc.com/_astats?application=&inf.name=eth0 HTTP/1.1" 200 273932 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.example.com/bot.html)"
要件
要件1: nginxログから、code、ip、datetime、protocol、request、sendbytes、referer、useragent、およびverbフィールドを抽出します。
要件2: uri_proto、uri_domain、およびuri_paramフィールドをrequestフィールドから抽出します。
要件3: uri_paramフィールドからuri_pathおよびuri_queryフィールドを抽出します。
DSL オーケストレーション
一般的なオーケストレーション
"""Step 1: Parse the nginx logs.""" e_regex("content",r'(? P<ip>\d+\.\d+\.\d+\.\d+)( - - \[)(? P<datetime>[\s\S]+)\] \"(? P<verb>[A-Z]+) (? P<request>[\S]*) (? P<protocol>[\S]+)["] (? P<code>\d+) (? P<sendbytes>\d+) ["](? P<refere>[\S]*)["] ["](? P<useragent>[\S\s]+)["]') """Step 2: Parse the request field obtained in Step 1.""" e_regex('request',r'(? P<uri_proto>(\w+)):\/\/(? P<uri_domain>[a-z0-9.] *[^\/])(? P<uri_param>(. +)$)') """Step 3: Parse the uri_param field obtained in Step 2.""" e_regex('uri_param',r'(? P<uri_path>\/\_[a-z]+[^?]) \?(? <uri_query>(. +)$)')
特定のオーケストレーションと変換結果
要件1に固有のオーケストレーション:
e_regex("content",r'(? P<ip>\d+\.\d+\.\d+\.\d+)( - - \[)(? P<datetime>[\s\S]+)\] \"(? P<verb>[A-Z]+) (? P<request>[\S]*) (? P<protocol>[\S]+)["] (? P<code>\d+) (? P<sendbytes>\d+) ["](? P<refere>[\S]*)["] ["](? P<useragent>[\S\s]+)["]')
サブ結果
__source__:192.168.0.1 __tag__:__receive_time__: 1563443076 code:200 content:192.168.0.2 - - [04/Jan/2019:16:06:38 +0800] "GET http://example.aliyundoc.com/_astats?application=&inf.name=eth0 HTTP/1.1" 200 273932 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.example.com/bot.html)"httpversion:1.1 datetime:04/Jan/2019:16:06:38 +0800 ip:192.168.0.2 protocol:HTTP/1.1 refere:- request:http://example.aliyundoc.com/_astats?application=&inf.name=eth0 sendbytes:273932 useragent:Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.example.com/bot.html) verb:GET
要件2に固有のオーケストレーション (リクエストフィールドの解析) 。
e_regex('request',r'(? P<uri_proto>(\w+)):\/\/(? P<uri_domain>[a-z0-9.] *[^\/])(? P<uri_param>(. +)$)')
サブ結果
uri_param: /_astats?application=&inf.name=eth0 uri_domain: example.aliyundoc.com uri_proto: http
要件3に固有のオーケストレーション (uri_paramフィールドの解析) 。
e_regex('uri_param',r'(? P<uri_path>\/\_[a-z]+[^?]) \?(? <uri_query>(. +)$)')
サブ結果
uri_path: /_astats uri_query: application=&inf.name=eth0
結果
__source__:192.168.0.1 __tag__:__receive_time__: 1563443076 code:200 content:192.168.0.2 - - [04/Jan/2019:16:06:38 +0800] "GET http://example.aliyundoc.com/_astats?application=&inf.name=eth0 HTTP/1.1" 200 273932 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.example.com/bot.html)"httpversion:1.1 datetime:04/Jan/2019:16:06:38 +0800 ip:192.168.0.2 protocol:HTTP/1.1 refere:- request:http://example.aliyundoc.com/_astats?application=&inf.name=eth0 sendbytes:273932 uri_domain:example.aliyundoc.com uri_proto:http uri_param: /_astats?application=&inf.name=eth0 uri_path: /_astats uri_query: application=&inf.name=eth0 useragent:Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.example.com/bot.html) verb:GET
Grok関数を使用して、成功ステータスコードを含むnginxアクセスログを解析します。
Grok関数を使用して、成功ステータスコードを含むnginxアクセスログを解析する方法を次の例に示します。
生のログエントリ
__source__: 192.168.0.1 __tag__:__client_ip__: 192.168.254.254 __tag__:__receive_time__: 1563443076 content: 192.168.0.2 - - [04/Jan/2019:16:06:38 +0800] "GET http://example.aliyundoc.com/_astats?application=&inf.name=eth0 HTTP/1.1" 200 273932 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.example.com/bot.html)"
要件
要件1: nginxログからclientip、bytes、agent、auth、verb、request、ident、timestamp、httpversion、response、およびreferrerフィールドを抽出します。
要件2: uri_proto、uri_domain、およびuri_paramフィールドをrequestフィールドから抽出します。
要件3: uri_paramフィールドからuri_pathおよびuri_queryフィールドを抽出します。
DSL オーケストレーション
一般的なオーケストレーション
"""Step 1: Parse the nginx logs.""" e_regex('content',grok('%{COMBINEDAPACHELOG}')) """Step 2: Parse the request field obtained in Step 1.""" e_regex('request',grok("%{URIPROTO:uri_proto}://(?:%{USER:user}(?::[^@]*)? @)?(?:%{URIHOST:uri_domain})?(?:%{URIPATHPARAM:uri_param})?")) """Step 3: Parse the uri_param field obtained in Step 2.""" e_regex('uri_param',grok("%{GREEDYDATA:uri_path}\? %{GREEDYDATA:uri_query}"))
Grok関数を使用してnginxログを解析するには、
COMBINEDAPACHELOG
パターンを使用するだけです。パターン
ルール
説明
COMMONAPACHELOG
%{IPORHOST:clientip} %
{HTTPDUSER:ident} %
{USER:auth} \[%
{HTTPDATE:timestamp}\] "(?:%
{WORD:verb} %
{NOTSPACE:request}(?: HTTP/%
{NUMBER:httpversion})? |%
{DATA:rawrequest})"%
{NUMBER:response} (?:%
{NUMBER: バイト} |-)
clientip、ident、auth、timestamp、verb、request、httpversion、response、bytesフィールドを解析します。
COMBINEDAPACHELOG
%{COMMONAPACHELOG} %
{QS: リファラー} %{QS: エージェント}
COMMONAPACHELOGパターンのすべてのフィールドを解析し、referrerフィールドとagentフィールドを解析します。
特定のオーケストレーションと変換結果
要件1に固有のオーケストレーション:
e_regex('content',grok('%{COMBINEDAPACHELOG}'))
サブ結果
clientip: 192.168.0.1 __tag__:__receive_time__: 1563443076 agent:"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.example.com/bot.html)" auth:- bytes:273932 clientip:192.168.0.2 content:192.168.0.2 - - [04/Jan/2019:16:06:38 +0800] "GET http://example.aliyundoc.com/_astats?application=&inf.name=eth0 HTTP/1.1" 200 273932 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.example.com/bot.html)" httpversion:1.1 ident:- referrer:"-" request:http://example.aliyundoc.com/_astats?application=&inf.name=eth0 response:200 timestamp:04/Jan/2019:16:06:38 +0800 verb:GET
要件2に固有のオーケストレーション (リクエストフィールドの解析) 。
e_regex('request',grok("%{URIPROTO:uri_proto}://(?:%{USER:user}(?::[^@]*)? @)?(?:%{URIHOST:uri_domain})?(?:%{URIPATHPARAM:uri_param})?"))
サブ結果
uri_proto: http uri_domain: example.aliyundoc.com uri_param: /_astats?application=&inf.name=eth0
Grokパターンを使用して、requestフィールドを解析できます。 次の表にパターンを示します。
パターン
ルール
説明
URIPROTO
[A-Za-z]+(\[A-Za-z +]+)?
URIスキームと一致します。 たとえば、
http:// hostname.domain.tld/_astats?application=&inf.name=eth0
では、一致するコンテンツはhttpです。USER
[a-zA-Z0-9. _-]+
文字、数字、および
を含むコンテンツと一致します。 _-
.URIHOST
%{IPORHOST}(?::%
IP アドレス、ホスト名、または正の整数と照合します。
URIPATHPARAM
%{URIPATH}(?:%{ URIPARAM})?
uri_param フィールドと一致します。
要件3に固有のオーケストレーション (uri_paramフィールドの解析) 。
e_regex('uri_param',grok("%{GREEDYDATA:uri_path}\? %{GREEDYDATA:uri_query}"))
サブ結果
uri_path: /_astats uri_query: application=&inf.name=eth0
次の表に、uri_paramフィールドの解析に使用されるGrokパターンを示します。
パターン
ルール
説明
GREEDYDATA
. *
改行ではないゼロまたは複数の文字と一致します。
結果
__source__:192.168.0.1 __tag__:__receive_time__: 1563443076 agent:"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.example.com/bot.html)" auth:- bytes:273932 clientip:192.168.0.2 content:192.168.0.2 - - [04/Jan/2019:16:06:38 +0800] "GET http://example.aliyundoc.com/_astats?application=&inf.name=eth0 HTTP/1.1" 200 273932 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.example.com/bot.html)" httpversion:1.1 ident:- referrer:"-" request:http://example.aliyundoc.com/_astats?application=&inf.name=eth0 response:200 timestamp:04/Jan/2019:16:06:38 +0800 uri_domain:example.aliyundoc.com uri_param:/_astats?application=&inf.name=eth0 uri_path:/_astats uri_proto:http uri_query:application=&inf.name=eth0 verb:GET
Grok関数を使用して、エラーステータスコードを含むnginxアクセスログを解析する
次の例は、Grok関数を使用して、エラーステータスコードを含むnginxアクセスログを解析する方法を示しています。
生のログエントリ
__source__: 192.168.0.1 __tag__:__client_ip__: 192.168.254.254 __tag__:__receive_time__: 1563443076 content: 2019/08/07 16:05:17 [error] 1234#1234: *1234567 attempt to send data on a closed socket: u:111111ddd, c:0000000000000000, ft:0 eof:0, client: 1.2.3.4, server: sls.aliyun.com, request: "GET /favicon.ico HTTP/1.1", host: "sls.aliyun.com", referrer: "https://sls.aliyun.com/question/answer/123.html?from=singlemessage"
要件 :
contentフィールドのhost、http_version、log_level、pid、referrer、request、request_time、server、およびverbフィールドを解析します。
DSLオーケストレーション:
e_regex('content',grok('%{DATESTAMP:request_time} \[%{LOGLEVEL:log_level}\] %{POSINT:pid}#%{NUMBER}: %{GREEDYDATA:errormessage}(?:, client: (? <client>%{IP}|%{HOSTNAME}))(?:, server: %{IPORHOST:server})(?:, request: "%{WORD:verb} %{NOTSPACE:request}( HTTP/%{NUMBER:http_version})")(?:, host: "%{HOSTNAME:host}")?(?:, referrer: "%{NOTSPACE:referrer}")?'))
結果
___source__: 192.168.0.1 __tag__:__client_ip__: 192.168.254.254 __tag__:__receive_time__: 1563443076 content:2019/08/07 16:05:17 [error] 1234#1234: *1234567 attempt to send data on a closed socket: u:111111ddd, c:0000000000000000, ft:0 eof:0, client: 1.2.3.4, server: sls.aliyun.com, request: "GET /favicon.ico HTTP/1.1", host: "sls.aliyun.com", referrer: "https://sls.aliyun.com/question/answer/123.html? host: sls.aliyun.com http_version: 1.1 log_level: error pid: 1234 referrer: https://sls.aliyun.com/question/answer/123.html?from=singlemessage request: /favicon.ico request_time:19/08/07 16:05:17 server: sls.aliyun.com verb: GET