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
-