すべてのプロダクト
Search
ドキュメントセンター

Simple Log Service:nginxログの解析

最終更新日:Aug 28, 2024

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ログから、codeipdatetimeprotocolrequestsendbytesrefereruseragent、およびverbフィールドを抽出します。

    • 要件2: uri_protouri_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=&amp;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=&amp;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=&amp;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=&amp;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ログからclientipbytesagentauthverbrequestidenttimestamphttpversionresponse、およびreferrerフィールドを抽出します。

    • 要件2: uri_protouri_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: バイト} |-)

      clientipidentauthtimestampverbrequesthttpversionresponsebytesフィールドを解析します。

      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=&amp;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=&amp;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=&amp;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=&amp;inf.name=eth0
    response:200
    timestamp:04/Jan/2019:16:06:38 +0800
    uri_domain:example.aliyundoc.com
    uri_param:/_astats?application=&amp;inf.name=eth0
    uri_path:/_astats
    uri_proto:http
    uri_query:application=&amp;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フィールドのhosthttp_versionlog_levelpidreferrerrequestrequest_timeserver、および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