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

Simple Log Service:Grok 関数

最終更新日:Jun 03, 2026

Grok 関数は、複雑な正規表現を事前定義された名前付きパターンに置き換えることで、ログ解析を簡素化します。

概要

Grok 関数は、正規表現関数のより簡単な代替手段です。Grok を正規表現関数と組み合わせて使用できます。

e_match("content", grok(r"\w+: (%{IP})"))  # abc: 192.0.2.0 や xyz: 192.0.2.2 などのパターンに一致します。
e_match("content", grok(r"\w+: (%{IP})", escape=True)) # abc: 192.0.2.0 には一致しませんが、\w+: 192.0.2.0 には一致します。

Grok 関数は、事前定義された正規表現パターンを使用して値を抽出します。

  • 関数の構文

    grok(pattern, escape=False, extend=None)
  • Grok の構文

    %{SYNTAX} 
    %{SYNTAX:NAME}

    SYNTAX は事前定義された正規表現パターンです。NAME は名前付きグループです。

    "%{IP}"               # r"(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})" と同等です。
    "%{IP:source_id}"     # r"(?P\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})" と同等です。
    ("%{IP}")             # r"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})" と同等です。

    Grok には 2 つのグループ化モードがあります。

    • キャプチャグループモード

      一部の Grok パターンには、名前付きキャプチャグループが組み込まれています。これらのパターンでは、%{SYNTAX} 構文のみを使用します。これらのパターンは、ログ文の解析によく使用されます。サポートされているログ形式は、Grok patterns に記載されています。

      "%{SYSLOGBASE}"        
      "%{COMMONAPACHELOG}" 
      "%{COMBINEDAPACHELOG}"
      "%{HTTPD20_ERRORLOG}"
      "%{HTTPD24_ERRORLOG}"
      "%{HTTPD_ERRORLOG}"
      ...
    • 非キャプチャグループモード

      一部の Grok パターンでは、非キャプチャグループモードが使用されます。例:

      "%{INT}"    
      "%{YEAR}"
      "%{HOUR}"
      ...
  • パラメーター

    パラメーター

    タイプ

    必須

    説明

    pattern

    String

    はい

    一致させる Grok パターンです。使用可能なパターンは Grok patterns に記載されています。

    escape

    Bool

    いいえ

    True に設定すると、Grok パターンの外側にある正規表現の特殊文字をエスケープします。デフォルト: False。

    extend

    Dict

    いいえ

    ユーザー定義の Grok 式です。

関数の例

  • 例 1: 日付と引用符付きの内容を抽出します。

    • 生ログ

      content: 2019 June 24 "I am iron man"
    • 変換ルール

      e_regex('content',grok('%{YEAR:year} %{MONTH:month} %{MONTHDAY:day} %{QUOTEDSTRING:motto}'))
    • 結果

      content: 2019 June 24 "I am iron man"
      year: 2019
      month: June
      day: 24
      motto: "I am iron man"
  • 例 2: HTTP リクエストログを抽出します。

    • 生ログ

      content: 10.0.0.0 GET /index.html 15824 0.043
    • 変換ルール

      e_regex('content',grok('%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}'))
    • 結果

      content: 10.0.0.0 GET /index.html 15824 0.043
      client: 10.0.0.0
      method: GET
      request: /index.html
      bytes: 15824
      duration: 0.043
  • 例 3: Apache ログを抽出します。

    • 生ログ

      content: 127.0.0.1 - - [13/Apr/2015:17:22:03 +0800] "GET /router.php HTTP/1.1" 404 285 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
    • 変換ルール

      e_regex('content',grok('%{COMBINEDAPACHELOG}'))
    • 結果

      content: 127.0.0.1 - - [13/Apr/2015:17:22:03 +0800] "GET /router.php HTTP/1.1" 404 285 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
      clientip: 127.0.0.1
      ident: -
      auth: -
      timestamp: 13/Apr/2015:17:22:03 +0800
      verb: GET
      request: /router.php
      httpversion: 1.1
      response: 404
      bytes: 285
      referrer: "-"
      agent: "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
  • 例 4: syslog エントリを解析します。

    • 生ログ

      content: May 29 16:37:11 sadness logger: hello world
    • 変換ルール

      e_regex('content',grok('%{SYSLOGBASE} %{DATA:message}'))
    • 結果

      content: May 29 16:37:11 sadness logger: hello world
      timestamp: May 29 16:37:11
      logsource: sadness
      program: logger
      message: hello world
  • 例 5: 特殊文字をエスケープします。

    • 生ログ

      content: Nov  1 21:14:23 scorn kernel: pid 84558 (expect), uid 30206: exited on signal 3
    • 変換ルール

      e_regex('content',grok(r'%{SYSLOGBASE} pid %{NUMBER:pid} \(%{WORD:program}\), uid %{NUMBER:uid}: exited on signal %{NUMBER:signal}'))

      このルールには、正規表現の特殊文字である括弧が含まれています。自動的にエスケープするには、escape を True に設定します。

      e_regex('content',grok('%{SYSLOGBASE} pid %{NUMBER:pid} (%{WORD:program}), uid %{NUMBER:uid}: exited on signal %{NUMBER:signal}', escape=True))
    • 結果

      content: Nov  1 21:14:23 scorn kernel: pid 84558 (expect), uid 30206: exited on signal 3
      timestamp: Nov  1 21:14:23
      logsource: scorn
      program: expect
      pid: 84558
      uid: 30206
      signal: 3
  • 例 6: カスタム Grok 式を使用します。

    • 生ログ

      content: Beijing-1104,taro 25 "never quit"
    • 変換ルール

      e_regex('content',grok('%{ID:user_id},%{WORD:name} %{INT:age} %{QUOTEDSTRING:motto}',extend={'ID': '%{WORD}-%{INT}'}))
    • 結果

      content: Beijing-1104,taro 25 "never quit"
      user_id: Beijing-1104
      name: taro
      age: 25
      motto: "never quit"
  • 例 7: JSON データに一致させます。

    • 生ログ

      content: 2019-10-29 16:41:39,218 - INFO: owt.AudioFrameConstructor - McsStats: {"event":"mediaStats","connectionId":"331578616547393100","durationMs":"5000","rtpPackets":"250","rtpBytes":"36945","nackPackets":"0","nackBytes":"0","rtpIntervalAvg":"20","rtpIntervalMax":"104","rtpIntervalVar":"4","rtcpRecvPackets":"0","rtcpRecvBytes":"0","rtcpSendPackets":"1","rtcpSendBytes":"32","frame":"250","frameBytes":"36945","timeStampOutOfOrder":"0","frameIntervalAvg":"20","frameIntervalMax":"104","frameIntervalVar":"4","timeStampIntervalAvg":"960","timeStampIntervalMax":"960","timeStampIntervalVar":"0"}
    • 変換ルール

      e_regex('content',grok('%{EXTRACTJSON}'))
    • 結果

      content: 2019-10-29 16:41:39,218 - INFO: owt.AudioFrameConstructor - McsStats: {"event":"mediaStats","connectionId":"331578616547393100","durationMs":"5000","rtpPackets":"250","rtpBytes":"36945","nackPackets":"0","nackBytes":"0","rtpIntervalAvg":"20","rtpIntervalMax":"104","rtpIntervalVar":"4","rtcpRecvPackets":"0","rtcpRecvBytes":"0","rtcpSendPackets":"1","rtcpSendBytes":"32","frame":"250","frameBytes":"36945","timeStampOutOfOrder":"0","frameIntervalAvg":"20","frameIntervalMax":"104","frameIntervalVar":"4","timeStampIntervalAvg":"960","timeStampIntervalMax":"960","timeStampIntervalVar":"0"}
      json:{"event":"mediaStats","connectionId":"331578616547393100","durationMs":"5000","rtpPackets":"250","rtpBytes":"36945","nackPackets":"0","nackBytes":"0","rtpIntervalAvg":"20","rtpIntervalMax":"104","rtpIntervalVar":"4","rtcpRecvPackets":"0","rtcpRecvBytes":"0","rtcpSendPackets":"1","rtcpSendBytes":"32","frame":"250","frameBytes":"36945","timeStampOutOfOrder":"0","frameIntervalAvg":"20","frameIntervalMax":"104","frameIntervalVar":"4","timeStampIntervalAvg":"960","timeStampIntervalMax":"960","timeStampIntervalVar":"0"}
  • 例 8: W3C ログを解析します。

    • 生ログ

      content: 2018-12-26 00:00:00 W3SVC2 application001 192.168.0.0 HEAD / - 8000 - 10.0.0.0 HTTP/1.0 - - - - 404 0 64 0 19 0
    • 変換ルール

      サポートされていない W3C フィールドはハイフン (-) として表示されます。これらのフィールドに一致させるには、Grok パターンでハイフンを使用します。

      e_regex("content",grok('%{DATE:data} %{TIME:time} %{WORD:s_sitename} %{WORD:s_computername} %{IP:s_ip} %{WORD:cs_method} %{NOTSPACE:cs_uri_stem} - %{NUMBER:s_port} - %{IP:c_ip} %{NOTSPACE:cs_version} - - - - %{NUMBER:sc_status} %{NUMBER:sc_substatus} %{NUMBER:sc_win32_status} %{NUMBER:sc_bytes} %{NUMBER:cs_bytes} %{NUMBER:time_taken}'))
    • 結果

      content: 2018-12-26 00:00:00 W3SVC2 application001 192.168.0.0 HEAD / - 8000 - 10.0.0.0 HTTP/1.0 - - - - 404 0 64 0 19 0 
      data: 18-12-26
      time: 00:00:00
      s_sitename: W3SVC2
      s_computername: application001
      s_ip: 192.168.0.0
      cs_method: HEAD
      cs_uri_stem: /
      s_port: 8000
      c_ip: 10.0.0.0
      cs_version: HTTP/1.0
      sc_status: 404
      sc_substatus: 0
      sc_win32_status: 64
      sc_bytes: 0
      cs_bytes: 19
      time_taken: 0