Tous les produits
Search
Centre de documentation

Simple Log Service:Fonction Grok

Dernière mise à jour :Aug 19, 2026

La fonction Grok simplifie l'analyse des journaux en remplaçant les expressions régulières complexes par des motifs nommés prédéfinis.

Présentation

La fonction Grok offre une alternative plus simple aux fonctions d'expression régulière. Vous pouvez combiner Grok avec des fonctions d'expression régulière :

e_match("content", grok(r"\w+: (%{IP})"))  # Matches patterns such as abc: 192.0.2.0 or xyz: 192.0.2.2.
e_match("content", grok(r"\w+: (%{IP})", escape=True)) # Does not match abc: 192.0.2.0, but matches \w+: 192.0.2.0.

La fonction Grok extrait les valeurs à l'aide de motifs d'expressions régulières prédéfinis.

  • Syntaxe de la fonction

    grok(pattern, escape=False, extend=None)
  • Syntaxe Grok

    %{SYNTAX} 
    %{SYNTAX:NAME}

    SYNTAX représente un motif d'expression régulière prédéfini. NAME désigne un groupe nommé.

    "%{IP}"               # Equivalent to r"(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"
    "%{IP:source_id}"     # Equivalent to r"(?P<source_id>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"
    ("%{IP}")             # Equivalent to r"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"

    Grok propose deux modes de regroupement :

    • Mode de groupe de capture

      Certains motifs Grok intègrent des groupes de capture nommés. Pour ces motifs, utilisez uniquement la syntaxe %{SYNTAX}. Ces motifs sont couramment employés pour analyser les instructions de journalisation. Les formats de journal pris en charge sont répertoriés dans la section Motifs Grok.

      "%{SYSLOGBASE}"        
      "%{COMMONAPACHELOG}" 
      "%{COMBINEDAPACHELOG}"
      "%{HTTPD20_ERRORLOG}"
      "%{HTTPD24_ERRORLOG}"
      "%{HTTPD_ERRORLOG}"
      ...
    • Mode de groupe sans capture

      Certains motifs Grok utilisent un mode de groupe sans capture. Par exemple :

      "%{INT}"    
      "%{YEAR}"
      "%{HOUR}"
      ...
  • Paramètres

    Paramètre

    Type

    Obligatoire

    Description

    pattern

    String

    Oui

    Motif Grok à faire correspondre. Les motifs disponibles sont répertoriés dans la section Motifs Grok.

    escape

    Bool

    Non

    S'il est défini sur True, échappe les caractères spéciaux regex situés en dehors des motifs Grok. Valeur par défaut : False.

    extend

    Dict

    Non

    Expression Grok définie par l'utilisateur.

Exemples de fonction

  • Exemple 1 : Extraire la date et le contenu entre guillemets.

    • Journal brut

      content: 2019 June 24 "I am iron man"
    • Règle de transformation

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

      content: 2019 June 24 "I am iron man"
      year: 2019
      month: June
      day: 24
      motto: "I am iron man"
  • Exemple 2 : Extraire un journal de requête HTTP.

    • Journal brut

      content: 10.0.0.0 GET /index.html 15824 0.043
    • Règle de transformation

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

      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
  • Exemple 3 : Extraire un journal Apache.

    • Journal brut

      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"
    • Règle de transformation

      e_regex('content',grok('%{COMBINEDAPACHELOG}'))
    • Résultat

      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"
  • Exemple 4 : Analyser une entrée syslog.

    • Journal brut

      content: May 29 16:37:11 sadness logger: hello world
    • Règle de transformation

      e_regex('content',grok('%{SYSLOGBASE} %{DATA:message}'))
    • Résultat

      content: May 29 16:37:11 sadness logger: hello world
      timestamp: May 29 16:37:11
      logsource: sadness
      program: logger
      message: hello world
  • Exemple 5 : Échapper les caractères spéciaux.

    • Journal brut

      content: Nov  1 21:14:23 scorn kernel: pid 84558 (expect), uid 30206: exited on signal 3
    • Règle de transformation

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

      Cette règle contient des parenthèses, qui sont des caractères spéciaux regex. Pour les échapper automatiquement, définissez escape sur True :

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

      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
  • Exemple 6 : Utiliser une expression Grok personnalisée.

    • Journal brut

      content: Beijing-1104,gary 25 "never quit"
    • Règle de transformation

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

      content: Beijing-1104,gary 25 "never quit"
      user_id: Beijing-1104
      name: gary
      age: 25
      motto: "never quit"
  • Exemple 7 : Faire correspondre des données JSON.

    • Journal brut

      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"}
    • Règle de transformation

      e_regex('content',grok('%{EXTRACTJSON}'))
    • Résultat

      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"}
  • Exemple 8 : Analyser un journal W3C.

    • Journal brut

      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
    • Règle de transformation

      Les champs W3C non pris en charge apparaissent sous forme de traits d'union (-). Utilisez des traits d'union dans le motif Grok pour faire correspondre ces champs.

      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}'))
    • Résultat

      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