Todos los productos
Search
Centro de documentos

Simple Log Service:Función Grok

Última actualización: Sep 02, 2026

La función Grok simplifica el análisis sintáctico de registros al reemplazar expresiones regulares complejas con patrones predefinidos con nombre.

Descripción general

La función Grok es una alternativa más sencilla a regular expression functions. Puede combinar Grok con funciones de expresiones regulares:

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 función Grok extrae valores mediante patrones de expresiones regulares predefinidos.

  • Sintaxis de la función

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

    %{SYNTAX} 
    %{SYNTAX:NAME}

    SYNTAX es un patrón de expresión regular predefinido. NAME es un grupo con nombre.

    "%{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 cuenta con dos modos de agrupación:

    • Modo de grupo de captura

      Algunos patrones de Grok incluyen grupos de captura con nombre integrados. Para estos patrones, utilice únicamente la sintaxis %{SYNTAX}. Estos patrones se usan comúnmente para analizar instrucciones de registro. Los formatos de registro compatibles se enumeran en Grok patterns.

      "%{SYSLOGBASE}"        
      "%{COMMONAPACHELOG}" 
      "%{COMBINEDAPACHELOG}"
      "%{HTTPD20_ERRORLOG}"
      "%{HTTPD24_ERRORLOG}"
      "%{HTTPD_ERRORLOG}"
      ...
    • Modo de grupo sin captura

      Algunos patrones de Grok utilizan un modo de grupo sin captura. Por ejemplo:

      "%{INT}"    
      "%{YEAR}"
      "%{HOUR}"
      ...
  • Parámetros

    Parámetro

    Tipo

    Obligatorio

    Descripción

    pattern

    String

    Sí

    El patrón Grok que se debe coincidir. Los patrones disponibles se enumeran en Grok patterns.

    escape

    Bool

    No

    Si se establece en True, escapa los caracteres especiales de expresiones regulares fuera de los patrones Grok. Valor predeterminado: False.

    extend

    Dict

    No

    Una expresión Grok definida por el usuario.

Ejemplos de la función

  • Ejemplo 1: Extraer la fecha y el contenido entre comillas.

    • Registro sin procesar

      content: 2019 June 24 "I am iron man"
    • Regla de transformación

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

      content: 2019 June 24 "I am iron man"
      year: 2019
      month: June
      day: 24
      motto: "I am iron man"
  • Ejemplo 2: Extraer un registro de solicitud HTTP.

    • Registro sin procesar

      content: 10.0.0.0 GET /index.html 15824 0.043
    • Regla de transformación

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

      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
  • Ejemplo 3: Extraer un registro de Apache.

    • Registro sin procesar

      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"
    • Regla de transformación

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

      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"
  • Ejemplo 4: Analizar sintácticamente una entrada de syslog.

    • Registro sin procesar

      content: May 29 16:37:11 sadness logger: hello world
    • Regla de transformación

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

      content: May 29 16:37:11 sadness logger: hello world
      timestamp: May 29 16:37:11
      logsource: sadness
      program: logger
      message: hello world
  • Ejemplo 5: Escapar caracteres especiales.

    • Registro sin procesar

      content: Nov  1 21:14:23 scorn kernel: pid 84558 (expect), uid 30206: exited on signal 3
    • Regla de transformación

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

      Esta regla contiene paréntesis, que son caracteres especiales de expresiones regulares. Para escaparlos automáticamente, establezca escape en True:

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

      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
  • Ejemplo 6: Usar una expresión Grok personalizada.

    • Registro sin procesar

      content: Beijing-1104,gary 25 "never quit"
    • Regla de transformación

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

      content: Beijing-1104,gary 25 "never quit"
      user_id: Beijing-1104
      name: gary
      age: 25
      motto: "never quit"
  • Ejemplo 7: Coincidir con datos JSON.

    • Registro sin procesar

      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"}
    • Regla de transformación

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

      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"}
  • Ejemplo 8: Analizar sintácticamente un registro W3C.

    • Registro sin procesar

      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
    • Regla de transformación

      Los campos W3C no compatibles aparecen como guiones (-). Utilice guiones en el patrón Grok para coincidir con estos campos.

      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}'))
    • Resultado

      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