Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Prozessoren, die Sie verwenden können
Dieser Abschnitt enthält Informationen zu jedem Prozessor, den Sie in einem Log-Event-Transformator verwenden können. Die Prozessoren können in Parser, String-Mutatoren, JSON-Mutatoren und Datumsprozessoren eingeteilt werden.
Konfigurierbare Prozessoren vom Typ Parser
parseJSON
Der ParseJSON-Prozessor analysiert JSON-Protokollereignisse und fügt extrahierte JSON-Schlüssel-Wert-Paare unter dem Ziel ein. Wenn Sie kein Ziel angeben, platziert der Prozessor das Schlüssel-Wert-Paar unter dem Stammknoten. Wenn Sie parseJSON
es als ersten Prozessor verwenden, müssen Sie das gesamte Protokollereignis @message
als Quellfeld analysieren. Nach der ersten JSON-Analyse können Sie dann bestimmte Felder in nachfolgenden Prozessoren bearbeiten.
Der ursprüngliche @message
Inhalt wird nicht geändert, die neuen Schlüssel werden der Nachricht hinzugefügt.
Feld | Beschreibung | Erforderlich? | Standard | Einschränkungen |
---|---|---|---|---|
Quelle |
Pfad zu dem Feld im Protokollereignis, das analysiert wird. Verwenden Sie die Punktnotation, um auf untergeordnete Felder zuzugreifen. Beispiel: store.book |
Nein |
|
Höchstlänge: 128 Maximale Tiefe verschachtelter Schlüssel: 3 |
Ziel |
Das Zielfeld der analysierten JSON-Datei |
Nein |
|
Höchstlänge: 128 Maximale Tiefe verschachtelter Schlüssel: 3 |
Beispiel
Angenommen, ein aufgenommenes Protokollereignis sieht wie folgt aus:
{ "outer_key": { "inner_key": "inner_value" } }
Wenn wir dann diesen ParseJSON-Prozessor haben:
[ { "parseJSON": { "destination": "new_key" } } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "new_key": { "outer_key": { "inner_key": "inner_value" } } }
Grok
Verwenden Sie den Grok-Prozessor, um unstrukturierte Daten mithilfe von Musterabgleich zu analysieren und zu strukturieren. Dieser Prozessor kann auch Felder aus Protokollnachrichten extrahieren.
Feld | Beschreibung | Erforderlich? | Standard | Einschränkungen | Hinweise |
---|---|---|---|---|---|
Quelle |
Pfad des Felds, auf das der Grok-Matching angewendet werden soll |
Nein |
|
Höchstlänge: 128 Maximale Tiefe verschachtelter Schlüssel: 3 |
|
match |
Das Grok-Muster, das mit dem Protokollereignis verglichen werden soll |
Ja |
Maximale Länge: 512 Maximale Anzahl von Grim-Mustern: 20 Für einige Grok-Mustertypen gelten individuelle Nutzungsbeschränkungen. Jede Kombination der folgenden Muster kann bis zu fünfmal verwendet werden: {URI, URIPARAM, URIPATHPARAM, SPACE, DATA, GREEDYDATA, GREEDYDATA_MULTILINE} Grok-Muster unterstützen keine Typkonvertierungen. Für gängige Protokollformatmuster (APACHE_ACCESS_LOG, NGINX_ACCESS_LOG, SYSLOG5424) werden nur die Muster DATA, GREEDYDATA oder GREEDYDATA_MULTILINE unterstützt, sodass sie nach dem allgemeinen Protokollmuster eingefügt werden können. |
Struktur eines Grok-Musters
Dies ist die unterstützte Grok-Musterstruktur:
%{PATTERN_NAME:FIELD_NAME}
-
PATTERN_NAME: Bezieht sich auf einen vordefinierten regulären Ausdruck für den Abgleich mit einem bestimmten Datentyp. Es werden nur vordefinierte Grok-Muster aus der Liste der unterstützten Grok-Muster unterstützt. Das Erstellen von benutzerdefinierten Mustern ist nicht zulässig.
-
FIELD_NAME: Weist dem extrahierten Wert einen Namen zu.
FIELD_NAME
ist optional, aber wenn Sie diesen Wert nicht angeben, werden die extrahierten Daten aus dem transformierten Protokollereignis gelöscht. Wenn die Notation mit PunktenFIELD_NAME
verwendet wird (z. B. „parent.child“), wird dies als JSON-Pfad betrachtet. -
Typkonvertierung: Explizite Typkonvertierungen werden nicht unterstützt. Verwenden Sie den TypeConverter Prozessor, um den Datentyp eines beliebigen von Grok extrahierten Werts zu konvertieren.
Um komplexere passende Ausdrücke zu erstellen, können Sie mehrere Grok-Muster kombinieren. Bis zu 20 Grok-Muster können kombiniert werden, um einem Protokollereignis zu entsprechen. Diese Kombination von Mustern %{NUMBER:timestamp} [%{NUMBER:db}
%{IP:client_ip}:%{NUMBER:client_port}] %{GREEDYDATA:data}
kann beispielsweise verwendet werden, um Felder aus einem langsamen Redis-Protokolleintrag wie folgt zu extrahieren:
1629860738.123456 [0 127.0.0.1:6379] "SET" "key1" "value1"
Grok-Beispiele
Beispiel 1: Verwenden Sie Grok, um ein Feld aus unstrukturierten Protokollen zu extrahieren
Beispielprotokoll:
293750 server-01.internal-network.local OK "[Thread-000] token generated"
Verwendeter Transformator:
[ { "grok": { "match": "%{NUMBER:version} %{HOSTNAME:hostname} %{NOTSPACE:status} %{QUOTEDSTRING:logMsg}" } } ]
Ausgabe:
{ "version": "293750", "hostname": "server-01.internal-network.local", "status": "OK", "logMsg": "[Thread-000] token generated" }
Beispielprotokoll:
23/Nov/2024:10:25:15 -0900 172.16.0.1 200
Verwendeter Transformator:
[ { "grok": { "match": "%{HTTPDATE:timestamp} %{IPORHOST:clientip} %{NUMBER:response_status}" } } ]
Ausgabe:
{ "timestamp": "23/Nov/2024:10:25:15 -0900", "clientip": "172.16.0.1", "response_status": "200" }
Beispiel 2: Verwenden Sie grok in Kombination mit parseJSON, um Felder aus einem JSON-Protokollereignis zu extrahieren
Beispielprotokoll:
{ "timestamp": "2024-11-23T16:03:12Z", "level": "ERROR", "logMsg": "GET /page.html HTTP/1.1" }
Verwendeter Transformator:
[ { "parseJSON": {} }, { "grok": { "source": "logMsg", "match": "%{WORD:http_method} %{NOTSPACE:request} HTTP/%{NUMBER:http_version}" } } ]
Ausgabe:
{ "timestamp": "2024-11-23T16:03:12Z", "level": "ERROR", "logMsg": "GET /page.html HTTP/1.1", "http_method": "GET", "request": "/page.html", "http_version": "1.1" }
Beispiel 3: Grok-Muster mit gepunkteter Anmerkung in FIELD_NAME
Beispielprotokoll:
192.168.1.1 GET /index.html?param=value 200 1234
Verwendeter Transformator:
[ { "grok": { "match": "%{IP:client.ip} %{WORD:method} %{URIPATHPARAM:request.uri} %{NUMBER:response.status} %{NUMBER:response.bytes}" } } ]
Ausgabe:
{ "client": { "ip": "192.168.1.1" }, "method": "GET", "request": { "uri": "/index.html?param=value" }, "response": { "status": "200", "bytes": "1234" } }
Unterstützte Grok-Muster
In den folgenden Tabellen sind die Muster aufgeführt, die vom grok
Prozessor unterstützt werden.
Allgemeine Grok-Muster
Grok-Muster | Beschreibung | Maximales Musterlimit | Beispiel |
---|---|---|---|
BENUTZERNAME oder BENUTZER | Entspricht einem oder mehreren Zeichen, die Kleinbuchstaben (a-z), Großbuchstaben (A-Z), Ziffern (0-9), Punkte (.), Unterstriche (_) oder Bindestriche (-) enthalten können | 20 |
Eingabe: Pattern: Ausgang: |
INT | Entspricht einem optionalen Plus- oder Minuszeichen, gefolgt von einer oder mehreren Ziffern. | 20 |
Eingabe: Pattern: Ausgang: |
BASE10 NUM | Entspricht einer Ganzzahl oder einer Gleitkommazahl mit optionalem Vorzeichen und Dezimaltrennzeichen | 20 |
Eingabe: Pattern: Ausgang: |
BASE16NUM | Entspricht Dezimal- und Hexadezimalzahlen mit einem optionalen Zeichen (+ oder -) und einem optionalen 0x-Präfix | 20 |
Eingabe: Pattern: Ausgang: |
POSEN | Entspricht ganzen positiven Ganzzahlen ohne führende Nullen, die aus einer oder mehreren Ziffern bestehen (1-9 gefolgt von 0-9) | 20 |
Eingabe: Pattern: Ausgang: |
NICHT NEGATIV | Entspricht allen ganzen Zahlen (bestehend aus einer oder mehreren Ziffern 0-9), einschließlich Null und Zahlen mit führenden Nullen. | 20 |
Eingabe: Pattern: Ausgang: |
WORT | Entspricht ganzen Wörtern, die aus einem oder mehreren Wortzeichen (\ w) bestehen, einschließlich Buchstaben, Ziffern und Unterstrichen | 20 |
Eingabe: Pattern: Ausgang: |
KEIN LEERZEICHEN | Entspricht einem oder mehreren Zeichen, die keine Leerzeichen sind. | 5 |
Eingabe: Pattern: Ausgang: |
SPACE | Entspricht null oder mehr Leerzeichen. | 5 |
Eingabe: Pattern: Ausgang: |
DATA | Entspricht einem beliebigen Zeichen (außer Zeilenumbruch) null oder öfter, nicht gierig. | 5 |
Eingabe: Pattern: Ausgang: |
GIERIGE DATEN | Entspricht einem beliebigen Zeichen (außer Newline) null Mal oder öfter, gierig. | 5 |
Eingabe: Pattern: Ausgang: |
GREEDYDATA_MULTILINE | Entspricht einem beliebigen Zeichen (einschließlich Zeilenumbruch) null Mal oder öfter, gierig. | 1 |
Eingabe:
Pattern: Ausgabe: |
ZEICHENFOLGE IN ANFÜHRUNGSZEICHEN | Findet Zeichenketten in Anführungszeichen (einfache oder doppelte Anführungszeichen) mit maskierten Zeichen. | 20 |
Eingabe: Pattern: Ausgang: |
UUID | Entspricht einem Standard-UUID-Format: 8 Hexadezimalzeichen, gefolgt von drei Gruppen von 4 Hexadezimalzeichen und endend mit 12 Hexadezimalzeichen, die alle durch Bindestriche getrennt sind. | 20 |
Eingabe: Pattern: Ausgang: |
URNE | Entspricht der URN-Syntax (Uniform Resource Name). | 20 |
Eingabe: Pattern: Ausgang: |
AWS Grok-Muster
Muster | Beschreibung | Maximales Musterlimit | Beispiel |
---|---|---|---|
ARN |
Stimmt mit AWS Amazon-Ressourcennamen (ARNs) überein und erfasst die Partition ( |
5 |
Eingabe: Pattern: Ausgang: |
Grok-Muster im Netzwerk
Grok-Muster | Beschreibung | Maximales Musterlimit | Beispiel |
---|---|---|---|
CISCOMAC | Entspricht einer MAC-Adresse im 4-4-4-Hexadezimalformat. | 20 |
Eingabe: Pattern: Ausgang: |
WINDOWS, MAC | Entspricht einer MAC-Adresse im Hexadezimalformat mit Bindestrichen | 20 |
Eingabe: Pattern: Ausgang: |
COMMONMAC | Entspricht einer MAC-Adresse im Hexadezimalformat mit Doppelpunkten. | 20 |
Eingabe: Pattern: Ausgang: |
MAC | Entspricht einem der CISCOMAC-, WINDOWSMAC- oder COMMONMAC-Grok-Muster | 20 |
Eingabe: Pattern: Ausgang: |
IPV6 | Stimmt mit IPv6 Adressen überein, einschließlich komprimierter Formulare und Adressen mit IPv4 -Zuordnung IPv6 . | 5 |
Eingabe: Pattern: Ausgang: |
IPV4 | Stimmt mit einer IPv4 Adresse überein. | 20 |
Eingabe: Pattern: Ausgang: |
IP | Stimmt entweder mit IPv6 Adressen überein, die von% {IPv6} unterstützt werden, oder IPv4 mit Adressen, die von% {IPv4} unterstützt werden | 5 |
Eingabe: Pattern: Ausgang: |
HOSTNAME oder HOST | Entspricht Domainnamen, einschließlich Subdomänen | 5 |
Eingabe: Pattern: Ausgang: |
IP ODER HOST | Entspricht entweder einem Hostnamen oder einer IP-Adresse | 5 |
Eingabe: Pattern: Ausgang: |
HOSTPORT | Entspricht einer IP-Adresse oder einem Hostnamen, wie sie vom Muster% {IPORHOST} unterstützt werden, gefolgt von einem Doppelpunkt und einer Portnummer, wobei der Port in der Ausgabe als „PORT“ erfasst wird. | 5 |
Eingabe: Pattern: Ausgang: |
URIHOST | Entspricht einer IP-Adresse oder einem Hostnamen, wie sie vom Muster% {IPORHOST} unterstützt werden, optional gefolgt von einem Doppelpunkt und einer Portnummer, wobei der Port als „Port“ erfasst wird, falls vorhanden. | 5 |
Eingabe: Pattern: Ausgang: |
Muster für Pfadwechsel
Grok-Muster | Beschreibung | Maximales Musterlimit | Beispiel |
---|---|---|---|
UNIXPATH | Entspricht URL-Pfaden, möglicherweise einschließlich Abfrageparametern. | 20 |
Eingabe: Pattern: Ausgang: |
WINPATH | Entspricht Windows-Dateipfaden. | 5 |
Eingabe: Pattern: Ausgang: |
PATH | Entspricht entweder URL- oder Windows-Dateipfaden | 5 |
Eingabe: Pattern: Ausgang: |
TTY | Entspricht Unix-Gerätepfaden für Terminals und Pseudoterminals. | 20 |
Eingabe: Pattern: Ausgang: |
URIPROTO | Entspricht Buchstaben, optional gefolgt von einem Pluszeichen (+) und zusätzlichen Buchstaben oder Pluszeichen (+) | 20 |
Eingabe: Pattern: Ausgang: |
URIPATH | Entspricht der Pfadkomponente einer URI | 20 |
Eingabe: Pattern: Ausgang: |
URIPARAM | Entspricht den URL-Abfrageparametern | 5 |
Eingabe: Pattern: Ausgang: |
URIPATHPARAM | Entspricht einem URI-Pfad, optional gefolgt von Abfrageparametern | 5 |
Eingabe: Pattern: Ausgang: |
URI | Entspricht einer vollständigen URI | 5 |
Eingabe: Pattern: Ausgang: |
Grok-Muster für Datum und Uhrzeit
Grok-Muster | Beschreibung | Maximales Musterlimit | Beispiel |
---|---|---|---|
MONAT | Entspricht vollständigen oder abgekürzten englischen Monatsnamen als ganze Wörter | 20 |
Eingabe: Pattern: Ausgang: Eingabe: Pattern: Ausgang: |
MONAT, ZAHL | Entspricht Monatszahlen von 1 bis 12, mit optionaler führender Null für einstellige Monate. | 20 |
Eingabe: Pattern: Ausgang: Eingabe: Pattern: Ausgang: |
MONTHNUM2 | Entspricht zweistelligen Monatszahlen von 01 bis 12. | 20 |
Eingabe: Pattern: Ausgang: |
MONAT/TAG | Entspricht dem Tag des Monats von 1 bis 31, optional mit vorangestellter Null. | 20 |
Eingabe: Pattern: Ausgang: |
JAHR | Entspricht dem Jahr zwei- oder vierstellig | 20 |
Eingabe: Pattern: Ausgang: Eingabe: Pattern: Ausgang: |
TAG | Entspricht vollständigen oder abgekürzten Tagesnamen. | 20 |
Eingabe: Pattern: Ausgang: |
STUNDE | Entspricht der Stunde im 24-Stunden-Format mit einer optionalen führenden Null (0) 0-23. | 20 |
Eingabe: Pattern: Ausgang: |
MINUTE | Stimmt mit Minuten überein (00-59). | 20 |
Eingabe: Pattern: Ausgang: |
SECOND | Entspricht einer Zahl, die Sekunden (0) 0-60 darstellt, optional gefolgt von einem Dezimalpunkt oder Doppelpunkt und einer oder mehreren Ziffern für Minutenbruchteile | 20 |
Eingabe: Pattern: Ausgang: Eingabe: Pattern: Ausgang: Eingabe: Pattern: Ausgang: |
TIME | Entspricht einem Zeitformat mit Stunden, Minuten und Sekunden im Format (H) H:mm :( s) s. Sekunden beinhalten Schaltsekunden (0) 0—60. | 20 |
Eingabe: Pattern: Ausgang: |
DATE_US | Entspricht einem Datum im Format (M) M/ (d) d/ (yy) yy oder (M) M- (d) d- (yy) yy. | 20 |
Eingabe: Pattern: Ausgang: Eingabe: Pattern: Ausgang: |
DATE_EU | Entspricht dem Datum im Format (d) d/ (M) M/ (yy) yy, (d) d- (M) M- (yy) yy oder (d) d. (M) M. (yy) yy. | 20 |
Eingabe: Pattern: Ausgang: Eingabe: Pattern: Ausgang: |
ISO8601_TIMEZONE | Entspricht dem UTC-Offset 'Z' oder dem Zeitzonen-Offset mit optionalem Doppelpunkt im Format [+-] (H) H (:) mm). | 20 |
Eingabe: Pattern: Ausgang: Eingabe: Pattern: Ausgang: Eingabe: Pattern: Ausgang: |
ISO8601_SEKUNDE | Entspricht einer Zahl, die Sekunden (0) 0-60 darstellt, optional gefolgt von einem Dezimalpunkt oder Doppelpunkt und einer oder mehreren Ziffern für Sekundenbruchteile | 20 |
Eingabe: Pattern: Ausgang: |
TIMESTAMP_ 01 ISO86 | Entspricht dem ISO86 01 Datums-/Uhrzeitformat (yy) yy- (M) M- (d) dT (H) H:mm :( (s) s) (Z| [+-] (H) H:mm) mit optionalen Sekunden und Zeitzone. | 20 |
Eingabe: Pattern: Ausgang: Eingabe: Pattern: Ausgang: Eingabe: Pattern: Ausgang: |
DATUM | Entspricht entweder einem Datum im US-Format mit% {DATE_US} oder einem Datum im EU-Format mit% {DATE_EU} | 20 |
Eingabe: Pattern: Ausgang: Eingabe: Pattern: Ausgang: |
DATUMSSTEMPEL | Entspricht dem Muster% {DATE} gefolgt vom Muster% {TIME}, getrennt durch Leerzeichen oder Bindestrich. | 20 |
Eingabe: Pattern: Ausgang: |
TZ | Entspricht gängigen Abkürzungen für Zeitzonen (PST, PDT, MST, MDT, CST CDT, EST, EDT, UTC). | 20 |
Eingabe: Pattern: Ausgang: |
DATESTAMP_ RFC822 | Entspricht Datum und Uhrzeit im folgenden Format: Tag MonthName (D) D (YY) YY (H) H:mm :( s) s Zeitzone | 20 |
Eingabe: Pattern: Ausgang: Eingabe: Pattern: Ausgang: |
DATESTAMP_ RFC2822 | Entspricht dem RFC2822 Datums-/Uhrzeitformat: Tag, (d) d MonthName (yy) yy (H) H:mm :( s) s Z| [+-] (H) H:mm | 20 |
Eingabe: Pattern: Ausgang: Eingabe: Pattern: Ausgang: |
DATESTAMP_OTHER | Entspricht Datum und Uhrzeit im folgenden Format: Tag MonthName (d) d (H) h:mm :( s) s Zeitzone (yy) yy | 20 |
Eingabe: Pattern: Ausgang: |
DATESTAMP_EVENTLOG | Entspricht dem kompakten Datetime-Format ohne Trennzeichen: (yy) yymm (d) d (H) Hmm (s) s | 20 |
Eingabe: Pattern: Ausgang: |
Loggen Sie die Grok-Muster ein
Grok-Muster | Beschreibung | Maximales Musterlimit | Beispiel |
---|---|---|---|
PROTOKOLLEBENE | Entspricht den Standardprotokollebenen mit unterschiedlichen Groß- und Kleinschreibung und Abkürzungen, einschließlich der folgenden: Alert/ALERT Trace/TRACE ,Debug/DEBUG ,Notice/NOTICE ,Info/INFO ,,Warn/Warning/WARN/WARNING ,Err/Error/ERR/ERROR , Crit/Critical/CRIT/CRITICAL Fatal/FATAL Severe/SEVERE Emerg/Emergency/EMERG/EMERGENCY |
20 |
Eingabe: Pattern: Ausgang: |
HTTP-DATUM | Entspricht dem Datums- und Uhrzeitformat, das häufig in Protokolldateien verwendet wird. Format: (d) MonthName d/ (yy) yy :( H) H:mm :( s) s Zeitzone: Entspricht vollständigen oder abgekürzten englischen Monatsnamen (Beispiel MonthName: „Jan“ oder „January“) Zeitzone: Entspricht dem% {INT} -Grok-Muster | 20 |
Eingabe: Pattern: Ausgang: |
SYSLOG-ZEITSTEMPEL | Entspricht dem Datumsformat mit MonthName (d) d (H) H:mm :( s) s MonthName: Entspricht vollständigen oder abgekürzten englischen Monatsnamen (Beispiel: „Jan“ oder „January“) | 20 |
Eingabe: Pattern: Ausgang: |
PROG | Entspricht einem Programmnamen, der aus einer Zeichenfolge aus Buchstaben, Ziffern, Punkt, Unterstrich, Schrägstrich, Prozentzeichen und Bindestrich besteht. | 20 |
Eingabe: Pattern: Ausgang: |
SYSLOGPROG | Entspricht dem PROG-Grok-Muster, optional gefolgt von einer Prozess-ID in eckigen Klammern. | 20 |
Eingabe: Pattern: Ausgang: |
SYSLOGHOST | Entspricht entweder einem% {HOST} - oder% {IP} -Muster | 5 |
Eingabe: Pattern: Ausgang: |
SYSLOG-EINRICHTUNG | Entspricht der Syslog-Priorität im Dezimalformat. Der Wert sollte in eckige Klammern (<>) eingeschlossen werden. | 20 |
Eingabe: Pattern: Ausgang: |
Gängige Log-Grok-Muster
Sie können vordefinierte benutzerdefinierte Grok-Muster verwenden, um den Protokollformaten von Apache, NGINX und Syslog Protocol (RFC 5424) zu entsprechen. Wenn Sie diese spezifischen Muster verwenden, müssen sie die ersten Muster in Ihrer passenden Konfiguration sein, und ihnen können keine anderen Muster vorausgehen. Außerdem können Sie ihnen nur mit genau einem DATA folgen. GREEDYDATA- oder GREEDYDATA_MULTILINE-Muster.
Grok-Muster | Beschreibung | Maximaler Grenzwert für Muster |
---|---|---|
APACHE_ACCESS_LOG |
Entspricht den Apache-Zugriffsprotokollen |
1 |
NGINX_ACCESS_LOG |
Entspricht den NGINX-Zugriffsprotokollen |
1 |
SYSLOG5424 |
Entspricht den Protokollen des Syslog-Protokolls (RFC 5424) |
1 |
Im Folgenden finden Sie gültige und ungültige Beispiele für die Verwendung dieser gängigen Protokollformatmuster.
"%{NGINX_ACCESS_LOG} %{DATA}" // Valid "%{SYSLOG5424}%{DATA:logMsg}" // Valid "%{APACHE_ACCESS_LOG} %{GREEDYDATA:logMsg}" // Valid "%{APACHE_ACCESS_LOG} %{SYSLOG5424}" // Invalid (multiple common log patterns used) "%{NGINX_ACCESS_LOG} %{NUMBER:num}" // Invalid (Only GREEDYDATA and DATA patterns are supported with common log patterns) "%{GREEDYDATA:logMsg} %{SYSLOG5424}" // Invalid (GREEDYDATA and DATA patterns are supported only after common log patterns)
Beispiele für gängige Protokollformate
Beispiel für ein Apache-Protokoll
Beispielprotokoll:
127.0.0.1 - - [03/Aug/2023:12:34:56 +0000] "GET /page.html HTTP/1.1" 200 1234
Transformator:
[ { "grok": { "match": "%{APACHE_ACCESS_LOG}" } } ]
Ausgabe:
{ "request": "/page.html", "http_method": "GET", "status_code": 200, "http_version": "1.1", "response_size": 1234, "remote_host": "127.0.0.1", "timestamp": "2023-08-03T12:34:56Z" }
Beispiel für ein NGINX-Protokoll
Beispielprotokoll:
192.168.1.100 - Foo [03/Aug/2023:12:34:56 +0000] "GET /account/login.html HTTP/1.1" 200 42 "https://www.amazon.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36"
Transformator:
[ { "grok": { "match": "%{NGINX_ACCESS_LOG}" } } ]
Ausgabe:
{ "request": "/account/login.html", "referrer": "https://www.amazon.com/", "agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36", "http_method": "GET", "status_code": 200, "auth_user": "Foo", "http_version": "1.1", "response_size": 42, "remote_host": "192.168.1.100", "timestamp": "2023-08-03T12:34:56Z" }
Beispiel für ein Syslog-Protokoll (RFC 5424)
Beispielprotokoll:
<165>1 2003-10-11T22:14:15.003Z mymachine.example.com evntslog - ID47 [exampleSDID@32473 iut="3" eventSource= "Application" eventID="1011"][examplePriority@32473 class="high"]
Transformator:
[ { "grok": { "match": "%{SYSLOG5424}" } } ]
Ausgabe:
{ "pri": 165, "version": 1, "timestamp": "2003-10-11T22:14:15.003Z", "hostname": "mymachine.example.com", "app": "evntslog", "msg_id": "ID47", "structured_data": "exampleSDID@32473 iut=\"3\" eventSource= \"Application\" eventID=\"1011\"", "message": "[examplePriority@32473 class=\"high\"]" }
Parse zu OCSF
Der ParseToOCSF-Prozessor konvertiert Protokolle in das Open
Der ursprüngliche @message
Inhalt wird nicht geändert, die neuen Schlüssel werden der Nachricht hinzugefügt.
Feld | Beschreibung | Erforderlich? | Standard | Einschränkungen |
---|---|---|---|---|
eventSource |
Der Dienst oder Prozess, der die Protokollereignisse erzeugt, die mit diesem Prozessor konvertiert werden. Gültige Werte:
|
Ja |
- |
- |
OCSF-Version |
Die Version des OCSF-Schemas, die für die transformierten Protokollereignisse verwendet werden soll. Derzeit ist der einzige unterstützte Wert V1.1 |
Ja |
|
- |
Beispiel
Im folgenden Beispiel werden Amazon VPC-Flow-Logs in das OCSF-Format umgewandelt.
[ "parseToOCSF": { eventSource: "VPCFlow", version: "V1.1" } ]
csv
Der CSV-Prozessor analysiert kommagetrennte Werte (CSV) aus den Protokollereignissen in Spalten.
Feld | Beschreibung | Erforderlich? | Standard | Einschränkungen |
---|---|---|---|---|
Quelle |
Pfad zu dem Feld im Protokollereignis, das analysiert werden soll |
Nein |
|
Höchstlänge: 128 Maximale Tiefe verschachtelter Schlüssel: 3 |
delimiter |
Das Zeichen, das verwendet wurde, um die einzelnen Spalten im ursprünglichen Protokollereignis mit kommagetrennten Werten zu trennen |
Nein |
|
Maximale Länge: 1 |
Zeichen in Anführungszeichen |
Zeichen, das als Textqualifizierer für eine einzelne Datenspalte verwendet wird |
Nein |
|
Maximale Länge: 1 |
Spalten |
Liste der Namen, die für die Spalten im transformierten Protokollereignis verwendet werden sollen. |
Nein |
|
Maximale Anzahl von CSV-Spalten: 100 Höchstlänge: 128 Maximale Tiefe verschachtelter Schlüssel: 3 |
Beispiel
Angenommen, ein Teil eines aufgenommenen Protokollereignisses sieht wie folgt aus:
'Akua Mansa',28,'New York, USA'
Angenommen, wir verwenden nur den CSV-Prozessor:
[ "csv": { "delimiter": ",", "quoteCharacter": ":"" } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "column_1": "Akua Mansa", "column_2": "28", "column_3": "New York: USA" }
parseKeyValue
Verwenden Sie den parseKeyValueProzessor, um ein bestimmtes Feld in Schlüssel-Wert-Paare zu zerlegen. Mit den folgenden Optionen können Sie den Prozessor so anpassen, dass er Feldinformationen analysiert.
Feld | Beschreibung | Erforderlich? | Standard | Einschränkungen |
---|---|---|---|---|
Quelle |
Pfad zu dem Feld im Protokollereignis, das analysiert werden soll |
Nein |
|
Höchstlänge: 128 Maximale Tiefe verschachtelter Schlüssel: 3 |
Ziel |
Das Zielfeld, in das die extrahierten Schlüssel-Wert-Paare eingefügt werden sollen |
Nein |
Höchstlänge: 128 |
|
FieldDelimiter |
Die Feldtrennzeichenfolge, die zwischen Schlüssel-Wert-Paaren in den ursprünglichen Protokollereignissen verwendet wird |
Nein |
|
Höchstlänge: 128 |
keyValueDelimiter |
Die Trennzeichenfolge, die zwischen dem Schlüssel und dem Wert in jedem Paar im transformierten Protokollereignis verwendet werden soll |
Nein |
|
Höchstlänge: 128 |
nonMatchValue |
Ein Wert, der in das Wertfeld im Ergebnis eingefügt werden soll, wenn ein Schlüssel-Wert-Paar nicht erfolgreich aufgeteilt wurde. |
Nein |
Höchstlänge: 128 |
|
keyPrefix |
Wenn Sie allen transformierten Schlüsseln ein Präfix hinzufügen möchten, geben Sie es hier an. |
Nein |
Höchstlänge: 128 |
|
overwriteIfExists |
Ob der Wert überschrieben werden soll, wenn der Zielschlüssel bereits existiert |
Nein |
|
Beispiel
Nehmen wir das folgende Beispiel für ein Protokollereignis:
key1:value1!key2:value2!key3:value3!key4
Angenommen, wir verwenden die folgende Prozessorkonfiguration:
[ { "parseKeyValue": { "destination": "new_key", "fieldDelimiter": "!", "keyValueDelimiter": ":", "nonMatchValue": "defaultValue", "keyPrefix": "parsed_" } } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "new_key": { "parsed_key1": "value1", "parsed_key2": "value2", "parsed_key3": "value3", "parsed_key4": "defaultValue" } }
Integrierte Prozessoren für AWS verkaufte Logs
Analysieren Sie WAF
Verwenden Sie diesen Prozessor, um verkaufte Logs zu analysieren AWS WAF . Er nimmt den Inhalt von jedem Header-Namen httpRequest.headers
und erstellt daraus JSON-Schlüssel mit dem entsprechenden Wert. Das Gleiche tut er auch für. labels
Diese Transformationen können das Abfragen von AWS WAF Protokollen erheblich vereinfachen. Weitere Informationen zum AWS WAF Protokollformat finden Sie unter Protokollbeispiele für Web-ACL-Verkehr.
Dieser Prozessor akzeptiert nur @message
die Eingabe.
Wichtig
Wenn Sie diesen Prozessor verwenden, muss es der erste Prozessor in Ihrem Transformator sein.
Beispiel
Nehmen wir das folgende Beispiel für ein Protokollereignis:
{ "timestamp": 1576280412771, "formatVersion": 1, "webaclId": "arn:aws:wafv2:ap-southeast-2:111122223333:regional/webacl/STMTest/1EXAMPLE-2ARN-3ARN-4ARN-123456EXAMPLE", "terminatingRuleId": "STMTest_SQLi_XSS", "terminatingRuleType": "REGULAR", "action": "BLOCK", "terminatingRuleMatchDetails": [ { "conditionType": "SQL_INJECTION", "sensitivityLevel": "HIGH", "location": "HEADER", "matchedData": ["10", "AND", "1"] } ], "httpSourceName": "-", "httpSourceId": "-", "ruleGroupList": [], "rateBasedRuleList": [], "nonTerminatingMatchingRules": [], "httpRequest": { "clientIp": "1.1.1.1", "country": "AU", "headers": [ { "name": "Host", "value": "localhost:1989" }, { "name": "User-Agent", "value": "curl/7.61.1" }, { "name": "Accept", "value": "*/*" }, { "name": "x-stm-test", "value": "10 AND 1=1" } ], "uri": "/myUri", "args": "", "httpVersion": "HTTP/1.1", "httpMethod": "GET", "requestId": "rid" }, "labels": [{ "name": "value" }] }
Die Prozessorkonfiguration sieht wie folgt aus:
[ { "parseWAF": {} } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "httpRequest": { "headers": { "Host": "localhost:1989", "User-Agent": "curl/7.61.1", "Accept": "*/*", "x-stm-test": "10 AND 1=1" }, "clientIp": "1.1.1.1", "country": "AU", "uri": "/myUri", "args": "", "httpVersion": "HTTP/1.1", "httpMethod": "GET", "requestId": "rid" }, "labels": { "name": "value" }, "timestamp": 1576280412771, "formatVersion": 1, "webaclId": "arn:aws:wafv2:ap-southeast-2:111122223333:regional/webacl/STMTest/1EXAMPLE-2ARN-3ARN-4ARN-123456EXAMPLE", "terminatingRuleId": "STMTest_SQLi_XSS", "terminatingRuleType": "REGULAR", "action": "BLOCK", "terminatingRuleMatchDetails": [ { "conditionType": "SQL_INJECTION", "sensitivityLevel": "HIGH", "location": "HEADER", "matchedData": ["10", "AND", "1"] } ], "httpSourceName": "-", "httpSourceId": "-", "ruleGroupList": [], "rateBasedRuleList": [], "nonTerminatingMatchingRules": [] }
Analysieren Sie PostGres
Verwenden Sie diesen Prozessor, um verkaufte Protokolle zu analysieren Amazon RDS for PostgreSQL , Felder zu extrahieren und sie in das JSON-Format zu konvertieren. Weitere Informationen zum Protokollformat RDS für PostgreSQL finden Sie unter Datenbankprotokolldateien von RDS for PostgreSQL.
Dieser Prozessor akzeptiert nur @message
als Eingabe.
Wichtig
Wenn Sie diesen Prozessor verwenden, muss es der erste Prozessor in Ihrem Transformator sein.
Beispiel
Nehmen wir das folgende Beispiel für ein Protokollereignis:
2019-03-10 03:54:59 UTC:10.0.0.123(52834):postgres@logtestdb:[20175]:ERROR: column "wrong_column_name" does not exist at character 8
Die Prozessorkonfiguration sieht wie folgt aus:
[ { "parsePostgres": {} } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "logTime": "2019-03-10 03:54:59 UTC", "srcIp": "10.0.0.123(52834)", "userName": "postgres", "dbName": "logtestdb", "processId": "20175", "logLevel": "ERROR" }
Analysieren Sie CloudFront
Verwenden Sie diesen Prozessor, um verkaufte Protokolle zu analysieren, Felder Amazon CloudFront zu extrahieren und sie in das JSON-Format zu konvertieren. Kodierte Feldwerte werden dekodiert. Werte, bei denen es sich um Ganzzahlen und Doppelzahlen handelt, werden als solche behandelt. Weitere Informationen zum Amazon CloudFront Protokollformat finden Sie unter Standardprotokolle (Zugriffsprotokolle) konfigurieren und verwenden.
Dieser Prozessor akzeptiert nur @message
als Eingabe.
Wichtig
Wenn Sie diesen Prozessor verwenden, muss es der erste Prozessor in Ihrem Transformator sein.
Beispiel
Nehmen wir das folgende Beispiel für ein Protokollereignis:
2019-12-04 21:02:31 LAX1 392 192.0.2.24 GET d111111abcdef8.cloudfront.net /index.html 200 - Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/78.0.3904.108%20Safari/537.36 - - Hit SOX4xwn4XV6Q4rgb7XiVGOHms_BGlTAC4KyHmureZmBNrjGdRLiNIQ== d111111abcdef8.cloudfront.net https 23 0.001 - TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 Hit HTTP/2.0 - - 11040 0.001 Hit text/html 78 - -
Die Prozessorkonfiguration sieht wie folgt aus:
[ { "parseCloudfront": {} } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "date": "2019-12-04", "time": "21:02:31", "x-edge-location": "LAX1", "sc-bytes": 392, "c-ip": "192.0.2.24", "cs-method": "GET", "cs(Host)": "d111111abcdef8.cloudfront.net", "cs-uri-stem": "/index.html", "sc-status": 200, "cs(Referer)": "-", "cs(User-Agent)": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36", "cs-uri-query": "-", "cs(Cookie)": "-", "x-edge-result-type": "Hit", "x-edge-request-id": "SOX4xwn4XV6Q4rgb7XiVGOHms_BGlTAC4KyHmureZmBNrjGdRLiNIQ==", "x-host-header": "d111111abcdef8.cloudfront.net", "cs-protocol": "https", "cs-bytes": 23, "time-taken": 0.001, "x-forwarded-for": "-", "ssl-protocol": "TLSv1.2", "ssl-cipher": "ECDHE-RSA-AES128-GCM-SHA256", "x-edge-response-result-type": "Hit", "cs-protocol-version": "HTTP/2.0", "fle-status": "-", "fle-encrypted-fields": "-", "c-port": 11040, "time-to-first-byte": 0.001, "x-edge-detailed-result-type": "Hit", "sc-content-type": "text/html", "sc-content-len": 78, "sc-range-start": "-", "sc-range-end": "-" }
ParseRoute53
Verwenden Sie diesen Prozessor, um verkaufte Protokolle zu analysieren Amazon Route 53 Public Data Plane , Felder zu extrahieren und sie in das JSON-Format zu konvertieren. Kodierte Feldwerte werden dekodiert. Dieser Prozessor unterstützt Amazon Route 53 Resolver keine Protokolle.
Dieser Prozessor akzeptiert nur @message
als Eingabe.
Wichtig
Wenn Sie diesen Prozessor verwenden, muss es der erste Prozessor in Ihrem Transformator sein.
Beispiel
Nehmen wir das folgende Beispiel für ein Protokollereignis:
1.0 2017-12-13T08:15:50.235Z Z123412341234 example.com AAAA NOERROR TCP IAD12 192.0.2.0 198.51.100.0/24
Die Prozessorkonfiguration sieht wie folgt aus:
[ { "parseRoute53": {} } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "version": 1.0, "queryTimestamp": "2017-12-13T08:15:50.235Z", "hostZoneId": "Z123412341234", "queryName": "example.com", "queryType": "AAAA", "responseCode": "NOERROR", "protocol": "TCP", "edgeLocation": "IAD12", "resolverIp": "192.0.2.0", "ednsClientSubnet": "198.51.100.0/24" }
ParseVPC
Verwenden Sie diesen Prozessor, um von Amazon VPC verkaufte Protokolle zu analysieren, Felder zu extrahieren und sie in das JSON-Format zu konvertieren. Kodierte Feldwerte werden dekodiert.
Dieser Prozessor akzeptiert nur @message
als Eingabe.
Wichtig
Wenn Sie diesen Prozessor verwenden, muss es der erste Prozessor in Ihrem Transformator sein.
Beispiel
Nehmen wir das folgende Beispiel für ein Protokollereignis:
2 123456789010 eni-abc123de 192.0.2.0 192.0.2.24 20641 22 6 20 4249 1418530010 1418530070 ACCEPT OK
Die Prozessorkonfiguration sieht wie folgt aus:
[ { "parseVPC": {} } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "version": 2, "accountId": "123456789010", "interfaceId": "eni-abc123de", "srcAddr": "192.0.2.0", "dstAddr": "192.0.2.24", "srcPort": 20641, "dstPort": 22, "protocol": 6, "packets": 20, "bytes": 4249, "start": 1418530010, "end": 1418530070, "action": "ACCEPT", "logStatus": "OK" }
Prozessoren mutieren durch Zeichenketten
lowerCaseString
Der lowerCaseString
Prozessor konvertiert eine Zeichenfolge in ihre kleingeschriebene Version.
Feld | Beschreibung | Erforderlich? | Standard | Einschränkungen |
---|---|---|---|---|
Mit Schlüsseln |
Eine Liste von Schlüsseln, die in Kleinbuchstaben umgewandelt werden sollen |
Ja |
Maximale Anzahl von Einträgen: 10 |
Beispiel
Nehmen wir das folgende Beispiel für ein Protokollereignis:
{ "outer_key": { "inner_key": "INNER_VALUE" } }
Die Transformer-Konfiguration sieht wie folgt aus und verwendet lowerCaseString
mitparseJSON
:
[ { "parseJSON": {} }, { "lowerCaseString": { "withKeys":["outer_key.inner_key"] } } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "outer_key": { "inner_key": "inner_value" } }
upperCaseString
Der upperCaseString
Prozessor konvertiert eine Zeichenfolge in ihre Großbuchstabenversion.
Feld | Beschreibung | Erforderlich? | Standard | Einschränkungen |
---|---|---|---|---|
Mit Schlüsseln |
Eine Liste von Schlüsseln, die in Großbuchstaben umgewandelt werden sollen |
Ja |
Maximale Anzahl von Einträgen: 10 |
Beispiel
Nehmen wir das folgende Beispiel für ein Protokollereignis:
{ "outer_key": { "inner_key": "inner_value" } }
Die Transformer-Konfiguration sieht wie folgt aus und verwendet upperCaseString
mitparseJSON
:
[ { "parseJSON": {} }, { "upperCaseString": { "withKeys":["outer_key.inner_key"] } } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "outer_key": { "inner_key": "INNER_VALUE" } }
SplitString
Der splitString
Prozessor ist ein Typ eines String-Mutate-Prozessors, der ein Feld mithilfe eines Trennzeichens in ein Array aufteilt.
Feld | Beschreibung | Erforderlich? | Standard | Einschränkungen |
---|---|---|---|---|
Einträge |
Array von Einträgen. Jedes Element im Array muss delimiter Felder enthaltensource . |
Ja |
Maximale Anzahl von Einträgen: 10 |
|
Quelle |
Der Schlüssel des Feldwerts, der geteilt werden soll |
Ja |
Höchstlänge: 128 |
|
delimiter |
Die Trennzeichenfolge, nach der der Feldwert aufgeteilt werden soll |
Ja |
Höchstlänge: 128 |
Beispiel 1
Nehmen wir das folgende Beispiel für ein Protokollereignis:
[ { "parseJSON": {} }, { "splitString": { "entries": [ { "source": "outer_key.inner_key", "delimiter": "_" } ] } } ]
Die Transformer-Konfiguration sieht wie folgt aus und verwendet splitString
mitparseJSON
:
[ { "parseJSON": {} }, { "splitString": { "entries": [ { "source": "outer_key.inner_key", "delimiter": "_" } ] } } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "outer_key": { "inner_key": [ "inner", "value" ] } }
Beispiel 2
Das Trennzeichen, anhand dessen die Zeichenfolge aufgeteilt werden soll, kann mehrere Zeichen lang sein.
Nehmen wir das folgende Beispiel für ein Protokollereignis:
{ "outer_key": { "inner_key": "item1, item2, item3" } }
Die Konfiguration des Transformators sieht wie folgt aus:
[ { "parseJSON": {} }, { "splitString": { "entries": [ { "source": "outer_key.inner_key", "delimiter": ", " } ] } } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "outer_key": { "inner_key": [ "item1", "item2", "item3" ] } }
SubstituteString
Der substituteString
Prozessor ist ein Typ eines String-Mutationsprozessors, der den Wert eines Schlüssels mit einem regulären Ausdruck vergleicht und alle Treffer durch eine Ersatzzeichenfolge ersetzt.
Feld | Beschreibung | Erforderlich? | Standard | Einschränkungen |
---|---|---|---|---|
Einträge |
Reihe von Einträgen. Jedes Element im Array muss to Felder source from , und enthalten. |
Ja |
Maximale Anzahl von Einträgen: 10 |
|
Quelle |
Der Schlüssel des Feldes, das geändert werden soll |
Ja |
Höchstlänge: 128 Maximale Tiefe verschachtelter Schlüssel: 3 |
|
from |
Die Zeichenfolge für reguläre Ausdrücke, die ersetzt werden soll. Spezielle reguläre Zeichen wie [und] müssen mit\\ maskiert werden, wenn doppelte Anführungszeichen verwendet werden, und mit\, wenn einfache Anführungszeichen verwendet werden oder wenn sie über den konfiguriert wurden. AWS Management Console Weitere Informationen finden Sie unter Class Pattern Sie können ein Muster einbinden |
Ja |
Höchstlänge: 128 |
|
to |
Die Zeichenfolge, die für jede Übereinstimmung von from Rückverweisen auf Erfassungsgruppen ersetzt werden soll, kann verwendet werden. Verwenden Sie die Form $n für nummerierte Gruppen wie $1 und ${group_name} für benannte Gruppen wie $. {my_group} > |
Ja |
Höchstlänge: 128 Maximale Anzahl von Rückverweisen: 10 Maximale Anzahl doppelter Rückverweise: 2 |
Beispiel 1
Nehmen wir das folgende Beispiel für ein Protokollereignis:
{ "outer_key": { "inner_key1": "[]", "inner_key2": "123-345-567", "inner_key3": "A cat takes a catnap." } }
Die Transformer-Konfiguration sieht wie folgt aus und verwendet substituteString
mitparseJSON
:
[ { "parseJSON": {} }, { "substituteString": { "entries": [ { "source": "outer_key.inner_key1", "from": "\\[\\]", "to": "value1" }, { "source": "outer_key.inner_key2", "from": "[0-9]{3}-[0-9]{3}-[0-9]{3}", "to": "xxx-xxx-xxx" }, { "source": "outer_key.inner_key3", "from": "cat", "to": "dog" } ] } } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "outer_key": { "inner_key1": "value1", "inner_key2": "xxx-xxx-xxx", "inner_key3": "A dog takes a dognap." } }
Beispiel 2
Nehmen wir das folgende Beispiel für ein Protokollereignis:
{ "outer_key": { "inner_key1": "Tom, Dick, and Harry", "inner_key2": "arn:aws:sts::123456789012:assumed-role/MyImportantRole/MySession" } }
Die Transformer-Konfiguration sieht wie folgt aus und verwendet substituteString
mitparseJSON
:
[ { "parseJSON": {} }, { "substituteString": { "entries": [ { "source": "outer_key.inner_key1", "from": "(\w+), (\w+), and (\w+)", "to": "$1 and $3" }, { "source": "outer_key.inner_key2", "from": "^arn:aws:sts::(?P<account_id>\\d{12}):assumed-role/(?P<role_name>[\\w+=,.@-]+)/(?P<role_session_name>[\\w+=,.@-]+)$", "to": "${account_id}:${role_name}:${role_session_name}" } ] } } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "outer_key": { "inner_key1": "Tom and Harry", "inner_key2": "123456789012:MyImportantRole:MySession" } }
TrimString
Der trimString
Prozessor entfernt Leerzeichen am Anfang und Ende eines Schlüssels.
Feld | Beschreibung | Erforderlich? | Standard | Einschränkungen |
---|---|---|---|---|
Mit Schlüsseln |
Eine Liste von Schlüsseln zum Trimmen |
Ja |
Maximale Anzahl an Einträgen: 10 |
Beispiel
Nehmen wir das folgende Beispiel für ein Protokollereignis:
{ "outer_key": { "inner_key": " inner_value " } }
Die Transformer-Konfiguration sieht wie folgt aus und verwendet trimString
mitparseJSON
:
[ { "parseJSON": {} }, { "trimString": { "withKeys":["outer_key.inner_key"] } } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "outer_key": { "inner_key": "inner_value" } }
JSON-Prozessoren mutieren
Schlüssel hinzufügen
Verwenden Sie den addKeys
Prozessor, um dem Protokollereignis neue Schlüssel-Wert-Paare hinzuzufügen.
Feld | Beschreibung | Erforderlich? | Standard | Einschränkungen |
---|---|---|---|---|
Einträge |
Reihe von Einträgen. Jedes Element im Array kann overwriteIfExists Felder key value , und enthalten. |
Ja |
Maximale Anzahl von Einträgen: 5 |
|
Schlüssel |
Der Schlüssel des neuen Eintrags, der hinzugefügt werden soll |
Ja |
Höchstlänge: 128 Maximale Tiefe verschachtelter Schlüssel: 3 |
|
Wert |
Der Wert des neuen Eintrags, der hinzugefügt werden soll |
Ja |
Maximale Länge: 256 |
|
overwriteIfExists |
Wenn Sie dies auf setzentrue , wird der bestehende Wert überschrieben, falls er im Ereignis key bereits vorhanden ist. Der Standardwert ist false . |
Nein |
false |
Kein Limit |
Beispiel
Nehmen wir das folgende Beispiel für ein Protokollereignis:
{ "outer_key": { "inner_key": "inner_value" } }
Die Transformer-Konfiguration sieht wie folgt aus und verwendet addKeys
mitparseJSON
:
[ { "parseJSON": {} }, { "addKeys": { "entries": [ { "source": "outer_key.new_key", "value": "new_value" } ] } } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "outer_key": { "inner_key": "inner_value", "new_key": "new_value" } }
Schlüssel löschen
Verwenden Sie den deleteKeys
Prozessor, um Felder aus einem Protokollereignis zu löschen. Diese Felder können Schlüssel-Wert-Paare enthalten.
Feld | Beschreibung | Erforderlich? | Standard | Einschränkungen |
---|---|---|---|---|
Mit Schlüsseln |
Die Liste der zu löschenden Schlüssel. |
Ja |
Kein Limit |
Maximale Anzahl an Einträgen: 5 |
Beispiel
Nehmen wir das folgende Beispiel für ein Protokollereignis:
{ "outer_key": { "inner_key": "inner_value" } }
Die Transformer-Konfiguration sieht wie folgt aus und verwendet deleteKeys
mitparseJSON
:
[ { "parseJSON": {} }, { "deleteKeys": { "withKeys":["outer_key.inner_key"] } } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "outer_key": {} }
MoveKeys
Verwenden Sie den moveKeys
Prozessor, um eine Taste von einem Feld in ein anderes zu verschieben.
Feld | Beschreibung | Erforderlich? | Standard | Einschränkungen |
---|---|---|---|---|
Einträge |
Reihe von Einträgen. Jedes Element im Array kann overwriteIfExists Felder source target , und enthalten. |
Ja |
Maximale Anzahl von Einträgen: 5 |
|
Quelle |
Der Schlüssel zum Bewegen |
Ja |
Höchstlänge: 128 Maximale Tiefe verschachtelter Schlüssel: 3 |
|
Ziel |
Der Schlüssel, zu dem gewechselt werden soll |
Ja |
Höchstlänge: 128 Maximale Tiefe verschachtelter Schlüssel: 3 |
|
overwriteIfExists |
Wenn Sie dies auf setzentrue , wird der vorhandene Wert überschrieben, falls er im key Ereignis bereits vorhanden ist. Der Standardwert ist false . |
Nein |
false |
Kein Limit |
Beispiel
Nehmen wir das folgende Beispiel für ein Protokollereignis:
{ "outer_key1": { "inner_key1": "inner_value1" }, "outer_key2": { "inner_key2": "inner_value2" } }
Die Transformer-Konfiguration sieht wie folgt aus und verwendet moveKeys
mitparseJSON
:
[ { "parseJSON": {} }, { "moveKeys": { "entries": [ { "source": "outer_key1.inner_key1", "target": "outer_key2" } ] } } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "outer_key1": {}, "outer_key2": { "inner_key2": "inner_value2", "inner_key1": "inner_value1" } }
Schlüssel umbenennen
Verwenden Sie den renameKeys
Prozessor, um Schlüssel in einem Protokollereignis umzubenennen.
Feld | Beschreibung | Erforderlich? | Standard | Einschränkungen |
---|---|---|---|---|
Einträge |
Reihe von Einträgen. Jedes Element im Array kann overwriteIfExists Felder key target , und enthalten. |
Ja |
Kein Limit |
Maximale Anzahl von Einträgen: 5 |
Schlüssel |
Der Schlüssel zum Umbenennen |
Ja |
Kein Limit |
Höchstlänge: 128 |
Ziel |
Der neue Schlüsselname |
Ja |
Kein Limit |
Höchstlänge: 128 Maximale Tiefe verschachtelter Schlüssel: 3 |
overwriteIfExists |
Wenn Sie dies auf setzentrue , wird der vorhandene Wert überschrieben, falls er im key Ereignis bereits vorhanden ist. Der Standardwert ist false . |
Nein |
false |
Kein Limit |
Beispiel
Nehmen wir das folgende Beispiel für ein Protokollereignis:
{ "outer_key": { "inner_key": "inner_value" } }
Die Transformer-Konfiguration sieht wie folgt aus und verwendet renameKeys
mitparseJSON
:
[ { "parseJSON": {} }, { "renameKeys": { "entries": [ { "key": "outer_key", "target": "new_key" } ] } } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "new_key": { "inner_key": "inner_value" } }
Wert kopieren
Verwenden Sie den copyValue
Prozessor, um Werte innerhalb eines Protokollereignisses zu kopieren. Sie können diesen Prozessor auch verwenden, um Metadaten zu Protokollereignissen hinzuzufügen, indem Sie die Werte der folgenden Metadatenschlüssel in die Protokollereignisse kopieren:@logGroupName
,@logGroupStream
,@accountId
,@regionName
. Dies wird im folgenden Beispiel veranschaulicht.
Feld | Beschreibung | Erforderlich? | Standard | Einschränkungen |
---|---|---|---|---|
Einträge |
Reihe von Einträgen. Jedes Element im Array kann overwriteIfExists Felder source target , und enthalten. |
Ja |
Maximale Anzahl von Einträgen: 5 |
|
Quelle |
Der Schlüssel zum Kopieren |
Ja |
Höchstlänge: 128 Maximale Tiefe verschachtelter Schlüssel: 3 |
|
Ziel |
Der Schlüssel, in den der Wert kopiert werden soll |
Ja |
Kein Limit |
Höchstlänge: 128 Maximale Tiefe verschachtelter Schlüssel: 3 |
overwriteIfExists |
Wenn Sie dies auf setzentrue , wird der vorhandene Wert überschrieben, falls er im key Ereignis bereits vorhanden ist. Der Standardwert ist false . |
Nein |
false |
Kein Limit |
Beispiel
Nehmen wir das folgende Beispiel für ein Protokollereignis:
{ "outer_key": { "inner_key": "inner_value" } }
Die Transformer-Konfiguration sieht wie folgt aus und verwendet copyValue
mitparseJSON
:
[ { "parseJSON": {} }, { "copyValue": { "entries": [ { "source": "outer_key.new_key", "target": "new_key" }, { "source": "@logGroupName", "target": "log_group_name" }, { "source": "@logGroupStream", "target": "log_group_stream" }, { "source": "@accountId", "target": "account_id" }, { "source": "@regionName", "target": "region_name" } ] } } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "outer_key": { "inner_key": "inner_value" }, "new_key": "inner_value", "log_group_name": "myLogGroupName", "log_group_stream": "myLogStreamName", "account_id": "012345678912", "region_name": "us-east-1" }
listToMap
Der listToMap
Prozessor nimmt eine Liste von Objekten, die Schlüsselfelder enthalten, und konvertiert sie in eine Zuordnung von Zielschlüsseln.
Feld | Beschreibung | Erforderlich? | Standard | Einschränkungen |
---|---|---|---|---|
Quelle |
Der Schlüssel in der ProcessingEvent mit einer Liste von Objekten, die in eine Map konvertiert werden |
Ja |
Höchstlänge: 128 Maximale Tiefe verschachtelter Schlüssel: 3 |
|
Schlüssel |
Der Schlüssel der Felder, die als Schlüssel in der generierten Map extrahiert werden sollen |
Ja |
Höchstlänge: 128 |
|
WertSchlüssel |
Wenn dies angegeben ist, werden die Werte, die Sie in diesem Parameter angeben, aus den source Objekten extrahiert und in die Werte der generierten Map eingefügt. Andernfalls werden die Originalobjekte in der Quellliste in die Werte der generierten Map aufgenommen. |
Nein |
Höchstlänge: 128 |
|
Ziel |
Der Schlüssel des Feldes, das die generierte Map enthalten soll |
Nein |
Stammknoten |
Höchstlänge: 128 Maximale Tiefe verschachtelter Schlüssel: 3 |
flatten |
Ein boolescher Wert, der angibt, ob die Liste in einzelne Elemente reduziert wird oder ob es sich bei den Werten in der generierten Map um Listen handelt. Standardmäßig werden die Werte für die passenden Schlüssel in einem Array dargestellt. Auf einstellen |
Nein |
false |
|
flattenedElement |
Wenn Sie flatten auf einstellentrue , geben Sie hier flattenedElement an, welches Element first oder last beibehalten werden soll. |
Erforderlich, wenn auf gesetzt |
Der Wert kann nur first oder sein last |
Beispiel
Nehmen wir das folgende Beispiel für ein Protokollereignis:
{ "outer_key": [ { "inner_key": "a", "inner_value": "val-a" }, { "inner_key": "b", "inner_value": "val-b1" }, { "inner_key": "b", "inner_value": "val-b2" }, { "inner_key": "c", "inner_value": "val-c" } ] }
Transformator für Anwendungsfall 1: flatten
ist false
[ { "parseJSON": {} }, { "listToMap": { "source": "outer_key" "key": "inner_key", "valueKey": "inner_value", "flatten": false } } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "outer_key": [ { "inner_key": "a", "inner_value": "val-a" }, { "inner_key": "b", "inner_value": "val-b1" }, { "inner_key": "b", "inner_value": "val-b2" }, { "inner_key": "c", "inner_value": "val-c" } ], "a": [ "val-a" ], "b": [ "val-b1", "val-b2" ], "c": [ "val-c" ] }
Transformator für Anwendungsfall 2: flatten
ist true
und flattenedElement
ist first
[ { "parseJSON": {} }, { "listToMap": { "source": "outer_key" "key": "inner_key", "valueKey": "inner_value", "flatten": true, "flattenedElement": "first" } } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "outer_key": [ { "inner_key": "a", "inner_value": "val-a" }, { "inner_key": "b", "inner_value": "val-b1" }, { "inner_key": "b", "inner_value": "val-b2" }, { "inner_key": "c", "inner_value": "val-c" } ], "a": "val-a", "b": "val-b1", "c": "val-c" }
Transformator für Anwendungsfall 3: flatten
ist true
und flattenedElement
ist last
[ { "parseJSON": {} }, { "listToMap": { "source": "outer_key" "key": "inner_key", "valueKey": "inner_value", "flatten": true, "flattenedElement": "last" } } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "outer_key": [ { "inner_key": "a", "inner_value": "val-a" }, { "inner_key": "b", "inner_value": "val-b1" }, { "inner_key": "b", "inner_value": "val-b2" }, { "inner_key": "c", "inner_value": "val-c" } ], "a": "val-a", "b": "val-b2", "c": "val-c" }
Prozessoren für Datentypkonverter
Typkonverter
Verwenden Sie den typeConverter
Prozessor, um einen Wertetyp, der dem angegebenen Schlüssel zugeordnet ist, in den angegebenen Typ zu konvertieren. Es handelt sich um einen Casting-Prozessor, der die Typen der angegebenen Felder ändert. Werte können in einen der folgenden Datentypen konvertiert werden: integer
double
, string
und. boolean
Feld | Beschreibung | Erforderlich? | Standard | Einschränkungen |
---|---|---|---|---|
Einträge |
Array von Einträgen. Jedes Element im Array muss type Felder enthaltenkey . |
Ja |
Maximale Anzahl von Einträgen: 10 |
|
Schlüssel |
Der Schlüssel mit dem Wert, der in einen anderen Typ konvertiert werden soll |
Ja |
Höchstlänge: 128 Maximale Tiefe verschachtelter Schlüssel: 3 |
|
Typ |
Der Typ, in den konvertiert werden soll. Gültige Werte sind integer double , string undboolean . |
Ja |
Beispiel
Nehmen wir das folgende Beispiel für ein Protokollereignis:
{ "name": "value", "status": "200" }
Die Transformer-Konfiguration sieht wie folgt aus und verwendet typeConverter
mitparseJSON
:
[ { "parseJSON": {} }, { "typeConverter": { "entries": [ { "key": "status", "type": "integer" } ] } } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "name": "value", "status": 200 }
DateTimeConverter
Verwenden Sie den datetimeConverter
Prozessor, um eine Datetime-Zeichenfolge in ein von Ihnen angegebenes Format zu konvertieren.
Feld | Beschreibung | Erforderlich? | Standard | Einschränkungen |
---|---|---|---|---|
Quelle |
Der Schlüssel, auf den die Datumskonvertierung angewendet werden soll. |
Ja |
Maximale Anzahl von Einträgen: 10 |
|
Muster abgleichen |
Eine Liste von Mustern, die mit dem Feld abgeglichen werden sollen source |
Ja |
Maximale Anzahl von Einträgen: 5 |
|
Ziel |
Das JSON-Feld, in dem das Ergebnis gespeichert werden soll. |
Ja |
Höchstlänge: 128 Maximale Tiefe verschachtelter Schlüssel: 3 |
|
Zielformat |
Das Datetime-Format, das für die konvertierten Daten im Zielfeld verwendet werden soll. |
Nein |
|
Maximale Länge: 64 |
Zeitzone der Quelle |
Die Zeitzone des Quellfeldes. Eine Liste möglicher Werte finden Sie unter Von Java unterstützte Zonen-IDs und Offsets |
Nein |
UTC |
Mindestlänge:1 |
Ziel-Zeitzone |
Die Zeitzone des Zielfeldes. Eine Liste möglicher Werte finden Sie unter Von Java unterstützte Zonen-IDs und Offsets |
Nein |
UTC |
Mindestlänge:1 |
locale |
Das Gebietsschema des Quellfeldes. Eine Liste möglicher Werte finden Sie unter Locale getAvailableLocales () -Methode in Java mit Beispielen |
Ja |
Mindestlänge:1 |
Beispiel
Nehmen wir das folgende Beispiel für ein Protokollereignis:
{"german_datetime": "Samstag 05. Dezember 1998 11:00:00"}
Die Transformer-Konfiguration sieht wie folgt aus und verwendet dateTimeConverter
mitparseJSON
:
[ { "parseJSON": {} }, { "dateTimeConverter": { "source": "german_datetime", "target": "target_1", "locale": "de", "matchPatterns": ["EEEE dd. MMMM yyyy HH:mm:ss"], "sourceTimezone": "Europe/Berlin", "targetTimezone": "America/New_York", "targetFormat": "yyyy-MM-dd'T'HH:mm:ss z" } } ]
Das transformierte Protokollereignis wäre das Folgende.
{ "german_datetime": "Samstag 05. Dezember 1998 11:00:00", "target_1": "1998-12-05T17:00:00 MEZ" }