In dieser Splunk-Schnellreferenz werden wichtige Begriffe und Features, Grundlagen der Splunk-Suchsprache SPL sowie häufig verwendete Befehle und Funktionen von Splunk Cloud und Splunk Enterprise beschrieben.
Ein Ereignis besteht aus einem Satz von Werten, denen ein Zeitstempel zugeordnet ist. Es handelt sich um einen einzelnen Dateneintrag, der ein- oder mehrzeilig sein kann. Ein Ereignis kann ein
Textdokument, eine Konfigurationsdatei oder auch eine komplette Stack Trace-Datei etc. sein. Dies ist ein Beispiel für ein Ereignis in einem Weblog:
173.26.34.223 - - [01/ Mar/2021:12:05:27 -0700] “GET /trade/ app?action=logout HTTP/1.1” 200 2953
Ihr könnt auch Transaktionen für die Suche und Gruppierung von Ereignissen definieren, die konzeptionell zusammenhängen, jedoch über eine gewisse Zeitspanne stattfinden. Transaktionen können aus mehreren Schritten bestehende, geschäftliche Aktivitäten darstellen, beispielsweise alle Ereignisse im Zusammenhang mit einer einzelnen Kundensitzung auf der Website eines Online-Händlers.
Ein Metrikdatenpunkt besteht aus einem Zeitstempel und einem oder mehreren Messwerten. Er kann auch Dimensionen beinhalten. Ein Messwert ist ein Metrikname und ein zugehöriger numerischer Wert. Dimensionen liefern weitere Informationen über die Messwerte. Beispiel für einen Metrikdatenpunkt:
Zeitstempel: 08-05-2020 16:26:42.025-0700
Messwert: metric_name:os.cpu. user=42.12, metric_name:max.size. kb=345
Dimensionen: hq=us-west-1, group=queue, name=azd
Metrikdatenpunkte und Ereignisse können gemeinsam durchsucht und korreliert werden, obwohl sie in separaten Indexarten gespeichert werden.
Als Host bezeichnet man das physische oder virtuelle Gerät, von dem ein Ereignis stammt. Darüber lassen sich alle Daten ermitteln, die von einem bestimmten Gerät stammen. Die Quelle ist der Name der Datei, des Verzeichnisses, des Datenstreams oder einer sonstigen Eingabe, aus der ein bestimmtes Ereignis stammt. Quellen werden als Sourcetypen klassifiziert. Diese sind entweder schon als bekannte Formate vordefiniert oder können vom Benutzer individuell definiert werden. Beispiele für gängige Sourcetypen sind HTTP-Webserverlogs und Windows-Ereignisprotokolle.
Ereignisse mit demselben Sourcetyp können aus unterschiedlichen Quellen stammen. Ereignisse aus der Datei
source=/var/log/messages
und von einem Syslog-Eingabeport
source=UDP:514
haben z. B. oftmals denselben Sourcetyp, nämlich
sourcetype=linux_syslog
Felder sind durchsuchbare Name-Wert-Paare, die Ereignisse voneinander unterscheiden. Nicht alle Ereignisse haben dieselben Felder und Feldwerte. Mit Feldern lassen sich individuell zugeschnittene Suchen erstellen, um exakt die gewünschten Ereignisse abzurufen. Wenn Splunk-Software bei der Indizierung und Suche Ereignisse verarbeitet, extrahiert die Software Felder auf der Grundlage von Definitionen in der Konfigurationsdatei und benutzerdefinierten Mustern.
Mit dem Feldextraktor-Tool könnt ihr bei der Suche reguläre Ausdrücke oder Trennzeichen wie Leerzeichen, Kommas oder andere Zeichen verwenden, um automatisch Feldextraktionen zu generieren und zu validieren.
Ein Tag ist ein Wissensobjekt, mit dem ihr nach Ereignissen suchen könnt, die bestimmte Feldwerte enthalten. Ihr könnt einer Feld-Wert-Kombination, einschließlich Eventtypen, Hosts, Quellen und Sourcetypen, ein oder mehrere Tags zuordnen. Mit Tags könnt ihr zusammengehörige Feldwerte gruppieren oder abstrakte Feldwerte wie IP-Adressen oder IDs nachverfolgen, indem ihr ihnen aussagekräftige Bezeichnungen zuordnet.
Bei der Indexverarbeitung (also zum Indizierungszeitpunkt) werden Daten aus einer Quelle auf einem Host gelesen und als Sourcetyp klassifiziert. Es werden Zeitstempel extrahiert und die Daten in einzelne Ereignisse geparst. Zum Segmentieren der Ereignisse für die Anzeige in den Suchergebnissen werden Zeilenumbruchregeln angewandt. Jedes Ereignis wird in einen Index auf der Festplatte geschrieben, aus dem es später bei Suchanfragen abgerufen wird.
Beim Starten einer Suche, also zum Suchzeitpunkt, werden indizierte Ereignisse von der Festplatte abgerufen. Felder werden aus dem Rohtext des Ereignisses extrahiert.
Beim Hinzufügen von Daten parst Splunk-Software die Daten in einzelne Ereignisse, extrahiert den Zeitstempel, wendet Zeilenumbruchregeln an und speichert die Ereignisse in einem Index. Ihr könnt neue Indizes für unterschiedliche Eingaben erstellen. Standardmäßig werden die Daten im Index „main“ gespeichert. Bei einer Suche werden Ereignisse aus einem oder mehreren Indizes abgerufen.
Die Suche ist für Benutzer die Hauptmethode, um in Splunk-Software durch Daten zu navigieren. Ihr könnt eine Suche schreiben, um Ereignisse aus einem Index abzurufen, Statistikbefehle zum Berechnen von Metriken und Erstellen von Berichten auszuführen, innerhalb eines rollenden Zeitfensters nach bestimmten Bedingungen zu suchen, Muster innerhalb eurer Daten zu erkennen, künftige Trends zu prognostizieren und vieles mehr. Mithilfe der Splunk Search Process Language (SPL™) werden die Ereignisse transformiert. Suchen können als Berichte gespeichert und für die Anzeige in Dashboards verwendet werden.
Bei Berichten handelt es sich um gespeicherte Suchen. Ihr könnt Berichte ad-hoc oder nach einem Zeitplan in regelmäßigen Intervallen ausführen und für einen geplanten Bericht festlegen, dass Benachrichtigungen ausgelöst werden, wenn die Ergebnisse bestimmte Bedingungen erfüllen. Berichte können als Dashboard-Teilfenster zu Dashboards hinzugefügt werden.
Dashboards bestehen aus Teilfenstern, die bestimmte Module wie Suchfelder, Felder und Datenvisualisierungen enthalten. Dashboard-Teilfenster sind meist mit gespeicherten Suchen verknüpft. In den Teilfenstern werden die Ergebnisse abgeschlossener Suchen sowie Daten aus Echtzeitsuchen angezeigt.
Benachrichtigungen werden ausgelöst, wenn Suchergebnisse bestimmte Bedingungen erfüllen. Ihr könnt Benachrichtigungen bei historischen und Echtzeitsuchen verwenden. Benachrichtigungen können so konfiguriert werden, dass sie Aktionen auslösen, z. B das Senden von Benachrichtigungsinformationen an bestimmte E-Mail-Adressen oder das Posten von Benachrichtigungsinformationen in einer Webressource.
Mit Splunk könnt ihr unterschiedliche Arten von Datensets erstellen und verwalten, darunter Lookups, Datenmodelle und Tabellen-Datensets. Tabellen-Datensets sind spezielle kuratierte Sammlungen von Ereignisdaten, die für einen bestimmten geschäftlichen Zweck erstellt werden. Mit Table Views, einem Tool, das komplexe Suchbefehle in einfache UI-Editor-Interaktionen übersetzt, könnt ihr leistungsstarke Tabellen-Datensets definieren und verwalten. Das Tool ist wirklich benutzerfreundlich und erfordert nur minimale Kenntnisse von Splunk SPL.
Ein Datenmodell ist eine hierarchisch organisierte Sammlung von Datensets. Ihr könnt ganze Datenmodelle oder bestimmte Datensets innerhalb von Datenmodellen in Suchen referenzieren. Außerdem könnt ihr auf Datenmodelle die Datenmodellbeschleunigung anwenden. Mit beschleunigten Datenmodellen lässt sich die Suchleistung drastisch steigern. Daher werden sie häufig für die Anzeige in Dashboard-Teilfenstern und wichtigen On-Demand-Berichten verwendet.
Bei Apps handelt es sich um eine Sammlung von Konfigurationen, Wissensobjekten und von Kunden entworfenen Ansichten und Dashboards. Apps erweitern die Splunk-Umgebung, um sie an spezifische Anforderungen operativer Teams wie etwa Administratoren von Unix- und Windows-Systemen, Experten für Netzwerksicherheit, Website-Manager, Business-Analysten usw. anzupassen. Innerhalb einer Splunk Enterprise- oder Splunk Cloud-Installation können mehrere Apps gleichzeitig ausgeführt werden.
Eine verteilte Suche bietet die Möglichkeit, eure Bereitstellung zu skalieren, indem die Suchverwaltungs- und Darstellungsebene von der Indizierungs- und Suchabrufebene getrennt wird. Die verteilte Suche wird verwendet, um eine horizontale Skalierung und damit eine Performance-Steigerung zu ermöglichen, den Zugriff auf indizierte Daten zu steuern und geografisch verteilte Daten zu verwalten.
Eine Splunk-Instanz, die Daten an eine andere Splunk-Instanz weiterleitet, wird als Forwarder bezeichnet.
Ein Indexer ist die Splunk-Instanz, die Daten indiziert. Der Indexer wandelt die Rohdaten in Ereignisse um und speichert die Ereignisse in einem Index. Außerdem durchsucht der Indexer die indizierten Daten bei Suchanforderungen. Die Such-Peers sind Indexer, die Suchanforderungen seitens des Search Head erfüllen.
In einer verteilten Suchumgebung ist der Search Head die Splunk-Instanz, die Suchanforderungen an eine Reihe von Such-Peers verteilt und die Ergebnisse beim Benutzer zusammenführt. Eine Instanz, die nur für Suchen, nicht jedoch für Indizierungen verwendet wird, wird in der Regel als dedizierter Search Head bezeichnet.
Eine Splunk-Suche besteht aus einer Reihe von Befehlen und Argumenten. Befehle werden mit einem „|“ (Pipe-Zeichen) verkettet, welches angibt, dass das Ergebnis eines Befehls an den nächsten Befehl auf der rechten Seite weitergegeben wird.
search | command1 arguments1 | command2 arguments2 | ...
Am Anfang der Suchpipeline steht ein impliziter Suchbefehl zum Abrufen von Ereignissen aus dem Index. Suchanforderungen werden mit Schlüsselwörtern, Ausdrücken in Anführungszeichen, booleschen Ausdrücken, Platzhaltern, Feldname-Wert-Paaren und Vergleichsausdrücken geschrieben. Der AND-Operator wird zwischen Suchbegriffen impliziert. Zum Beispiel:
sourcetype=access_combined error | top 5 uri
Diese Suche ruft indizierte Webaktivitätsereignisse ab, die den Begriff „error“ enthalten. Für diese Ereignisse werden die fünf häufigsten URI-Werte zurückgegeben.
Suchbefehle werden verwendet, um unerwünschte Ereignisse zu filtern, weitere Informationen zu extrahieren, Werte zu berechnen, zu transformieren und die indizierten Daten statistisch zu analysieren. Die aus dem Index abgerufenen Suchergebnisse könnt ihr euch als dynamische Tabelle vorstellen. Jedes indizierte Ereignis ist eine Zeile. Die Feldwerte sind Spalten. Durch jeden Suchbefehl wird die Form dieser Tabelle neu definiert. Durch Suchbefehle, die Ereignisse filtern, werden beispielsweise Zeilen entfernt, während durch Suchbefehle, die Felder extrahieren, Spalten hinzugefügt werden.
Mit den Suchmodifikatoren „latest“ und „earliest“ könnt ihr einen Zeitraum angeben, in dem Ereignisse in Übereinstimmung mit eurer Suche abgerufen werden sollen.Relative Zeiten werden in einer Zeichenkette spezifiziert, die die Zeit (Ganzzahl und Einheit) angibt und optional eine „snap to“-Zeiteinheit enthalten kann. Die Syntax lautet:
[+|-]<integer><unit>@<snap_time_ unit>
Die Suche
“error earliest=-1d@d latest=h@h”
ruft Ereignisse ab, die „error“ enthalten und von gestern ab Mitternacht (00:00:00) bis zur letzten vollen Stunde des heutigen Tages aufgetreten sind.
Mit „snap to“ wird die Zeit auf die letzte volle angegebenen Einheit abgerundet. Wenn es zum Beispiel 11:59:00 ist und ihr „snap to hours“ (@h) angebt, wird 11:00:00 verwendet, nicht 12:00:00. Ihr könnt für „snap to“ auch bestimmte Wochentage angeben, indem ihr @w0 für Sonntag, @w1 für Montag verwendet usw.
Untergeordnete Suchen
Eine untergeordnete Suche (auch Subsuche) führt eine eigene Suche aus und gibt die Ergebnisse als Argumentwert an den übergeordneten Befehl zurück. Die untergeordnete Suche wird zuerst ausgeführt und ist in eckige Klammern eingeschlossen. Bei der folgenden Suche wird zum Beispiel eine untergeordnete Suche verwendet, um alle Syslog-Ereignisse des Benutzers zu finden, bei dem der letzte Anmeldefehler aufgetreten ist:
sourcetype=syslog [ search login error | return 1 user ]
Suchen optimieren
Entscheidend für schnelle Suchen ist die Beschränkung der Daten, die von der Festplatte abgerufen werden müssen, auf ein absolutes Minimum. Dann kommt es darauf an, die Daten möglichst früh im Suchvorgang zu filtern, sodass nur das erforderliche Minimum an Daten verarbeitet wird.
Wenn ihr nur selten Suchen in mehreren Datentypen durchführt, solltet ihr die Daten auf separate Indizes aufteilen. Beispielsweise könnt ihr Webdaten in einem Index speichern und Firewalldaten in einem anderen.
Beschränkt den Zeitraum auf den erforderlichen Rahmen. Beispiel: -1h nicht -1w oder earliest=-1d.
Gestaltet die Suche so spezifisch wie möglich. Beispiel: fatal_error und nicht *error*. In Dashboards empfiehlt sich die Verwendung von Post-Processing-Suchen.
Nutzt die Features für Zusammenfassungsindizierung, Berichte und Datenmodellbeschleunigung.
Machine Learning-Funktionen
Die Machine Learning-Funktionen von Splunk sind in unser gesamtes Portfolio integriert und
durch Angebote wie das Splunk Machine Learning Toolkit, das Streaming ML-Framework und das Splunk Machine Learning Environment in unsere Lösungen eingebettet.
In mehreren Splunk-Produkten kommt bereits eine neue Version der Suchsprache SPL namens SPL2 zum Einsatz, die sich durch größere Benutzerfreundlichkeit auszeichnet, selten verwendete Befehle entfernt und die Konsistenz der Befehlssyntax optimiert. Weitere Informationen findet ihr in der Referenzdokumentation zur SPL2-Suche.
Häufig verwendete Suchbefehle | |
Befehl | Beschreibung |
chart/ timechart | Gibt Ergebnisse in einer tabellarischen Ausgabe für (Zeitreihen-)Diagramme zurück. |
dedup | Entfernt nachfolgende Ergebnisse, die einem angegebenen Kriterium entsprechen. |
eval | Berechnet einen Ausdruck. Siehe HÄUFIG VERWENDETE EVAL-FUNKTIONEN. |
Felder | Entfernt Felder aus den Suchergebnissen. |
head/tail | Gibt die ersten/letzten N Ergebnisse zurück. |
lookup | Fügt Feldwerte aus einer externen Quelle hinzu. |
rename | Benennt ein Feld um. Platzhalter verwenden, um mehrere Felder anzugeben. |
rex | Gibt mit regulären Ausdrücken benannte Gruppen an, um Felder zu extrahieren. |
search | Filtert Ergebnisse heraus, die mit dem Suchausdruck übereinstimmen. |
Sortieren | Sortiert die Suchergebnisse nach den angegebenen Feldern. |
stats | Stellt Statistiken bereit, die optional nach Feldern gruppiert werden können. Siehe HÄUFIG VERWENDETE STATISTIKFUNKTIONEN. |
mstats | Ähnlich wie stats, wird jedoch auf Metriken statt auf Ereignisse angewendet. |
table | Gibt Felder an, die im Ergebnissatz verbleiben sollen. Speichert Daten in einem Tabellenformat. |
top/rare | Zeigt die häufigsten/seltensten Werte eines Feldes an. |
transaction | Gruppiert Suchergebnisse in Transaktionen. |
where | Filtert Suchergebnisse mithilfe von Eval-Ausdrücken. Wird verwendet, um zwei verschiedene Felder zu vergleichen. |
Der Eval-Befehl berechnet einen Ausdruck und fügt den resultierenden Wert in ein Feld ein (z. B. "...| eval force = mass * acceleration"). In der folgenden Tabelle sind einige Funktionen aufgelistet, die mit dem Eval-Befehl verwendet werden. Ihr könnt auch einfache arithmetische Operatoren (+ - * / %), Zeichenfolgenverkettung (z. B. "...| eval name = last . "," . first") und boolesche Operatoren (AND OR NOT XOR < > <= >= != = == LIKE) verwenden. | |||
Funktion | Beschreibung | Beispiele | |
abs(X) | Gibt den absoluten Wert von X zurück. | abs(number) | |
case(X,"Y",…) | Verwendet Argumentpaare von X und Y, wobei die X-Argumente boolesche Ausdrücke sind. Wenn diese als TRUE ausgewertet werden, geben sie das entsprechende Y-Argument zurück. | case(error == 404, "Not found", error ==500,"Internal Server Error", error == 200, "OK") | |
ceil(X) | Obergrenze einer Zahl X. | ceil(1.9) | |
cidrmatch("X",Y) | Identifiziert IP-Adressen, die zu einem bestimmten Subnetz gehören. | cidrmatch("123.132.32.0/25",ip) | |
coalesce(X,…) | Gibt den ersten Wert zurück, der nicht NULL ist. | coalesce(null(), "Returned val", null()) | |
cos(X) | Berechnet den Kosinus von X. | n=cos(0) | |
exact(X) | Wertet einen Ausdruck X mit Gleitkommaarithmetik mit doppelter Genauigkeit aus. | exact(3.14*num) | |
exp(X) | Gibt eX zurück. | exp(3) | |
if(X,Y,Z) | Wenn X als TRUE ausgewertet wird, ist das Ergebnis das zweite Argument Y. Wenn X als FALSE ausgewertet wird, ist das Ergebnis das dritte Argument Z. | if(error==200, "OK", "Error") | |
in(field,valuelist) | Gibt TRUE zurück, wenn ein Wert in der Werteliste („valuelist“) mit einem Wert im angegebenen Feld („field“) übereinstimmt. Die Funktion „in“ ist innerhalb der Funktion „if“ zu verwenden. | if(in(status, “404”,”500”,”503”),”true”,”false”) | |
isbool(X) | Gibt TRUE zurück, wenn X ein boolescher Wert ist. | isbool(field) | |
isint(X) | Gibt TRUE zurück, wenn X eine Ganzzahl ist. | isint(field) | |
isnull(X) | Gibt TRUE zurück, wenn X NULL ist. | isnull(field) | |
isstr() | Gibt TRUE zurück, wenn X eine Zeichenfolge ist. | isstr(field) | |
len(X) | Diese Funktion gibt die Zeichenlänge einer Zeichenfolge X zurück. | len(field) | |
like(X,"Y") | Gibt TRUE nur dann zurück, wenn X dem SQLite-Muster in Y entspricht. | like(field, "addr%") | |
log(X,Y) | Gibt den Logarithmus des ersten Arguments X zurück, wobei das zweite Argument Y als Basis dient. Y ist standardmäßig auf 10 eingestellt. | log(number,2) | |
lower(X) | Gibt X in Kleinbuchstaben zurück. | lower(username) | |
ltrim(X,Y) | Gibt X zurück, wobei die in Y angegebenen Zeichen auf der linken Seite entfernt werden. Die Standardangabe für Y sind Leerzeichen und Tabulatoren. | ltrim(" ZZZabcZZ ", " Z") | |
match(X,Y) | Wird zurückgegeben, falls X dem Regex-Muster Y entspricht. | match(field, "^\d{1,3}\.\d$") | |
max(X,…) | Gibt das Maximum zurück. | max(delay, mydelay) | |
md5(X) | Gibt den MD5-Hash eines Zeichenfolgenwerts X zurück. | md5(field) | |
min(X,…) | Gibt das Minimum zurück. | min(delay, mydelay) | |
mvcount(X) | Gibt die Anzahl der Werte von X zurück. | mvcount(multifield) | |
mvfilter(X) | Filtert ein Multiwertfeld basierend auf dem booleschen Ausdruck X. | mvfilter(match(email, "net$")) | |
mvindex(X,Y,Z) | Gibt eine Teilmenge des Multiwertfelds X von der Startposition (nullbasiert) Y bis Z (optional) zurück. | mvindex(multifield, 2) | |
mvjoin(X,Y) | Ausgehend von einem Multiwertfeld X und einem Zeichenfolgentrennzeichen Y werden die einzelnen Werte von X unter Verwendung von Y verknüpft. | mvjoin(address, ";") | |
now() | Gibt die aktuelle Zeit zurück, angegeben in Unix-Zeit. | now() | |
null() | Diese Funktion akzeptiert keine Argumente und gibt NULL zurück. | null() | |
nullif(X,Y) | Ausgehend von zwei Argumenten, den Feldern X und Y, wird X zurückgegeben, wenn die Argumente ungleich sind. Andernfalls wird NULL zurückgegeben. | nullif(fieldA, fieldB) | |
random() | Gibt eine Pseudozufallszahl von 0 bis 2147483647 zurück. | random() | |
relative_time (X,Y) | Ausgehend von der Epoch-Zeit X und der relativen Zeitangabe Y, wird der Epoch-Zeitwert von Y angewendet auf X zurückgegeben. | relative_time(now(),"-1d@d") | |
replace(X,Y,Z) | Gibt eine Zeichenfolge zurück, die durch das Ersetzen jedes Vorkommens der Regex-Zeichenfolge Y in der Zeichenfolge X durch die Zeichenfolge Z gebildet wird. | Gibt das Datum mit vertauschten Monats- und Tageszahlen zurück. Bei einer Eingabe von 4/30/2021 wäre der Rückgabewert also 30/4/2021: replace(date,"^(\d{1,2})/(\d{1,2})/", "\2/\1/") | |
round(X,Y) | Gibt X zurück, gerundet auf die Anzahl der Dezimalstellen, die durch Y angegeben werden. Standardmäßig wird auf eine Ganzzahl gerundet. | round(3.5) | |
rtrim(X,Y) | Gibt X zurück, wobei die in Y angegebenen Zeichen auf der rechten Seite entfernt werden. Wenn Y nicht angegeben ist, werden Leerzeichen und Tabulatoren entfernt. | rtrim(" ZZZZabcZZ ", " Z") | |
split(X,"Y") | Gibt X als Multiwertfeld zurück, aufgeteilt durch das Trennzeichen Y. | split(address, ";") | |
sqrt(X) | Gibt die Quadratwurzel von X zurück. | sqrt(9) | |
strftime(X,Y) | Gibt den Epoch-Zeitwert X im durch Y angegebenen Format zurück. | strftime(_time, "%H:%M") | |
strptime(X,Y) | Gibt ausgehend von einer Zeit, die durch die Zeichenfolge X dargestellt wird, den aus dem Format Y geparsten Wert zurück. | strptime(timeStr, "%H:%M") | |
substr(X,Y,Z) | Gibt ein Teilzeichenfolgenfeld X von der Startposition (einsbasiert) Y für Z (optional) Zeichen zurück. | substr("string", 1, 3) | |
time() | Gibt die Wanduhrzeit mit Mikrosekundengenauigkeit zurück. | time() | |
tonumber(X,Y) | Konvertiert die Eingabezeichenfolge X in eine Zahl, wobei Y (optional, Standardwert ist 10) die Basis der Zahl definiert, in die konvertiert werden soll. | tonumber("0A4",16) | |
tostring(X,Y) | Gibt einen Feldwert X als Zeichenfolge zurück. Wenn der Wert von X eine Zahl ist, wird X als Zeichenfolge neu formatiert. Wenn X ein boolescher Wert ist, wird X als „True“ oder „False“ neu formatiert. Wenn X eine Zahl ist, ist das zweite Argument Y optional und kann entweder „hex“ (konvertiert X in eine Hexadezimalzahl), „commas“ (formatiert X mit Kommas und zwei Dezimalstellen) oder „duration“ (konvertiert X aus einem Zeitformat in Sekunden in ein lesbares Zeitformat: HH:MM:SS) sein. | Rückgabe dieses Beispiels: foo=615 and foo2=00:10:15:… | eval foo=615 | eval foo2 = tostring(foo, “duration”) | |
typeof(X) | Gibt eine Zeichenfolgendarstellung des Feldtyps zurück. | Rückgabe dieses Beispiels: “NumberStringBoolInvalid”: typeof(12)+ typeof(“string”)+ | |
urldecode(X) | Gibt die URL X decodiert zurück. | urldecode("http%3A%2F%2Fwww.splunk.com%2Fdownload%3Fr%3Dheader") | |
validate| (X,Y,…) | Gibt ausgehend von Argumentpaaren, booleschen Ausdrücken X und Zeichenfolgen Y, die Zeichenfolge Y zurück, die dem ersten Ausdruck X entspricht, der als FALSE ausgewertet wird. Wird standardmäßig auf NULL gesetzt, wenn alle Werte TRUE sind. | validate(isint(port), "ERROR: Port is not an integer", port >= 1 AND port <= 65535, "ERROR:Port is out of range") |
Allgemeine Statistikfunktionen, die mit den Befehlen chart, stats und timechart verwendet werden. Feldnamen können mit Platzhaltern versehen werden, sodass avg(*delay) den Durchschnitt der Felder delay und xdelay berechnen kann. | |||
avg(X) | Gibt den Mittelwert der Werte des Felds X zurück. | ||
count(X) | Gibt die Anzahl der Vorkommen des Felds X zurück. Um einen bestimmten Feldwert anzugeben, der übereinstimmen soll, formatiert ihr X als eval(field="value"). | ||
dc(X) | Gibt die Anzahl der eindeutigen Werte des Felds X zurück. | ||
earliest(X) | Gibt den chronologisch frühesten Wert von X zurück. | ||
latest(X) | Gibt den chronologisch spätesten Wert von X zurück. | ||
max(X) | Gibt den Maximalwert des Felds X zurück. Wenn die Werte von X nicht numerisch sind, wird der Maximalwert aus der alphabetischen Reihenfolge ermittelt. | ||
median(X) | Gibt den mittleren Wert des Felds X zurück. | ||
min(X) | Gibt den Minimalwert des Felds X zurück. Wenn die Werte von X nicht numerisch sind, wird der Minimalwert aus der alphabetischen Reihenfolge ermittelt. | ||
mode(X) | Gibt den am häufigsten vorkommenden Wert des Felds X zurück. | ||
perc<X>(Y) | Gibt den X-ten Perzentilwert des Felds X zurück. Beispielsweise gibt perc5(total) den fünften Perzentilwert des Felds „total“ zurück. | ||
range(X) | Gibt die Differenz zwischen dem Maximal- und Minimalwert des Felds X zurück. | ||
stdev(X) | Gibt die Standardabweichung einer Stichprobe des Felds X zurück. | ||
stdevp(X) | Gibt die Standardabweichung der Population des Felds X zurück. | ||
sum(X) | Gibt die Summe der Werte des Felds X zurück. | ||
sumsq(X) | Gibt die Quadratsumme der Werte des Felds X zurück. | ||
values(X) | Gibt die Liste aller eindeutigen Werte des Felds X als Eintrag mit mehreren Werten zurück. Die Reihenfolge der Werte ist alphabetisch. | ||
var(X) | Gibt die Stichprobenvarianz des Felds X zurück. |
Ergebnisse filtern | |
Gibt X zurück, gerundet auf die Anzahl der Dezimalstellen, die durch Y angegeben werden. Standardmäßig wird auf eine Ganzzahl gerundet. | round(3.5) |
Gibt X zurück, wobei die in Y angegebenen Zeichen auf der rechten Seite entfernt werden. Wenn Y nicht angegeben ist, werden Leerzeichen und Tabulatoren entfernt. | rtrim(" ZZZZabcZZ ", " Z") |
Gibt X als Multiwertfeld zurück, aufgeteilt durch das Trennzeichen Y. | split(address, ";") |
Gibt ausgehend von Argumentpaaren, booleschen Ausdrücken X und Zeichenfolgen Y, die Zeichenfolge Y zurück, die dem ersten Ausdruck X entspricht, der als FALSE ausgewertet wird. Wird standardmäßig auf NULL gesetzt, wenn alle Werte TRUE sind. | validate(isint(port), "ERROR: Port is not an integer", port >= 1 AND port <= 65535, "ERROR: Port is out of range") |
Ergebnisse gruppieren | |
Ergebnisse clustern, nach ihren „cluster_count“-Werten sortieren und dann die 20 größten Cluster (in Bezug auf die Datengröße) zurückgeben. | … | cluster t=0.9 showcount=true | sort limit=20 -cluster_count |
Ergebnisse, die den gleichen „host“ und „cookie“ aufweisen, innerhalb von 30 Sekunden auftreten und bei denen zwischen den einzelnen Ereignissen keine Pause von mehr als 5 Sekunden liegt, in einer Transaktion gruppieren. | … | transaction host cookie maxspan=30s maxpause=5s |
Ergebnisse mit der gleichen IP-Adresse (clientip) gruppieren, bei denen das erste Ergebnis „signon“ und das letzte Ergebnis „purchase“ enthält. | … | transaction clientip startswith="signon" endswith="purchase" |
Ergebnisse sortieren | |
Die ersten 20 Ergebnisse zurückgeben. | … | head 20 |
Die Reihenfolge eines Ergebnissatzes umkehren. | … | reverse |
Die Ergebnisse nach „ip“-Wert (in aufsteigender Reihenfolge) sortieren und dann nach „url“-Wert (in absteigender Reihenfolge). | … | sort ip, -url |
Die letzten 20 Ergebnisse in umgekehrter Reihenfolge zurückgeben. | … | tail 20 |
Reporting | |
Mittelwert und Anzahl unter Verwendung einer 30-Sekunden-Spanne aller Metriken, die mit cpu.percent enden, aufgeschlüsselt nach Metriknamen zurückgeben. | | mstats avg(_value), count(_value) WHERE metric_name=”*.cpu.percent” by metric_name span=30s |
max(delay) für jeden Wert von foo aufgeschlüsselt nach dem Wert von bar zurückgeben. | … | chart max(delay) over foo by bar |
max(delay) für jeden Wert von foo zurückgeben. | … | chart max(delay) over foo |
Anzahl der Ereignisse nach „host“. | … | stats count by host |
Eine Tabelle mit der Anzahl der Ereignisse und einem kleinen Liniendiagramm erstellen. | … | stats sparkline count by host |
Zeitdiagramm für die Anzahl der „web“-Quellen nach „host“ erstellen. | … | timechart count by host |
Mittelwert von „CPU“ pro Minute pro „host“ berechnen. | … | timechart span=1m avg(CPU) by host |
Mittelwert für jede Stunde eines eindeutigen Felds zurückgeben, das mit der Zeichenfolge „lay“ endet (z. B. delay, xdelay, relay usw.) | … | stats avg(*lay) by date_hour |
Die 20 häufigsten Werte des Felds „url“ zurückgeben. | … | top limit=20 url |
Die seltensten Werte des Felds „url“ zurückgeben. | … | rare url |
Erweitertes Reporting | |
Durchschnittliche Gesamtdauer berechnen und „avgdur“ als neues Feld zu jedem Ereignis hinzufügen, für das das Feld „duration“ existiert. | ... | eventstats avg(duration) as avgdur |
Kumulative Summe der Bytes ermitteln. | ... | streamstats sum(bytes) as bytes_total | timechart max(bytes_ total) |
Anomalien im Feld „Close_Price“ während der letzten zehn Jahre finden. | sourcetype=nasdaq earliest=-10y | anomalydetection Close_Price |
Diagramm erstellen, das die Anzahl der Ereignisse mit einem prognostizierten Wert und Bereich zeigt, die für jedes Ereignis in der Zeitreihe hinzugefügt wurden. | ... | timechart count | predict count |
Einen einfachen gleitenden Mittelwert über fünf Ereignisse für das Feld „count“ berechnen und in das neue Feld „smoothed_ count“ schreiben. | “... | timechart count | trendline sma5(count) as smoothed_count” |
Metriken | |
Alle Metriknamen im Metrikindex „_metrics“ auflisten. | | mcatalog values(metric_ name) WHERE index=_ metrics |
Beispiele für die Metrikdatenpunkte anzeigen, die im Metrikindex „_metrics“ gespeichert sind. | | mpreview index=_ metrics target_per_ timeseries=5 |
Den Mittelwert einer Metrik im Metrikindex „_metrics“ zurückgeben. Die Ergebnisse werden in Zeitspannen von 30 Sekunden zusammengefasst. | | mstats avg(aws.ec2. CPUUtilization) WHERE index=_metrics span=30s |
Felder hinzufügen | |
Geschwindigkeit auf Entfernung/Zeit einstellen. | … | eval velocity=distance/time |
Die Felder „from“ und „to“ mit regulären Ausdrücken extrahieren. Wenn ein Rohereignis „From: Susan To: David“ enthält, dann ist from=Susan und to=David. | … | rex field=_raw "From: (?<from>.*) To: (?<to>.*)" |
Die laufende Summe von „count“ in einem Feld namens „total_count“ speichern. | … | accum count as total_count |
Für jedes Ereignis, bei dem „count“ vorhanden ist, die Differenz zwischen count und seinem vorherigen Wert berechnen und das Ergebnis in „countdiff“ speichern. | … | delta count as countdiff |
Felder filtern | |
Nur die Felder „host“ und „ip“ beibehalten und in dieser Reihenfolge anzeigen. | … | fields + host, ip |
Die Felder „host“ und „ip“ aus den Ergebnissen entfernen. | … | fields - host, ip |
Lookup-Tabellen (nur Splunk Enterprise) | |
Für jedes Ereignis die Lookup-Tabelle usertogroup nutzen, um den übereinstimmenden „user“-Wert aus dem Ereignis zu lokalisieren. Den Wert des Gruppenfelds im Ereignis ausgeben. | … | lookup usertogroup user output group |
In der Lookup-Tabelle usertogroup lesen, die in der Datei transforms.conf definiert ist. | … | inputlookup usertogroup |
Die Suchergebnisse in die Lookup-Datei „users.csv“ schreiben. | … | outputlookup users.csv |
Felder modifizieren | |
Das Feld „ip“ in „IPAddress“ umbenennen. | … | rename _ip as IPAddress |
Reguläre Ausdrücke (Regexe) | |||
Reguläre Ausdrücke sind in vielen Bereichen nützlich, z. B. bei den Suchbefehlen regex und rex, Eval-Funktionen match() und replace() und in der Feldextraktion. | |||
Regex | Kommentar | Beispiel | Erläuterung |
\s | Leerraum | \d\s\d | Ziffer Leerraum Ziffer |
\S | kein Leerraum | \d\S\d | Ziffer Nicht-Leerraum Ziffer |
\d | Ziffer | \d\d\d-\d\d- \d\d\d\d | Sozialversicherungsnummer (USA) |
\D | keine Ziffer | \D\D\D | drei Nicht-Ziffern |
\w | Wortzeichen (Buchstabe, Zahl oder _) | \w\w\w | drei Wortzeichen |
\W | kein Wortzeichen | \W\W\W | drei Nicht-Wortzeichen |
[...] | beliebiges enthaltenes Zeichen | [a-z0-9#] | beliebiges Zeichen von a bis z, 0 bis 9 oder # |
[^...] | nicht enthaltenes Zeichen | [^xyz] | jedes Zeichen außer x, y oder z |
* | null oder mehr | \w* | null oder mehr Wortzeichen |
+ | eins oder mehr | \d+ | Ganzzahl |
? | null oder eins | \d\d\d-?\d\d- ?\d\d\d\d | Sozialversicherungsnummer (USA) mit optionalen Bindestrichen |
| | oder | \w|\d | Wort- oder Ziffernzeichen |
(?P<var> ...) | benannte Extraktion | (?P<ssn>\d\d\d- \d\d-\d\d\d\d) | Sozialversicherungsnummer (USA) extrahieren und dem Feld „ssn“ zuweisen |
(?: ... ) | logische oder atomare Gruppen | (?:[a-zA-Z]|\d) | Buchstabe ODER Ziffer |
^ | Zeilenanfang | ^\d+ | Zeile beginnt mit mindestens einer Ziffer |
$ | Zeilenende | \d+$ | Zeile endet mit mindestens einer Ziffer |
{...} | Anzahl der Wiederholungen | \d{3,5} | zwischen 3 und 5 Ziffern |
\ | Escape | \[ | das [-Zeichen escapen |
Multiwertfelder | |
Die multiplen Werte des Felds „recipients“ zu einem einzigen Wert kombinieren | … | nomv recipients |
Werte des Feld „recipients“ in mehrere Feldwerte trennen und die Top-Empfänger anzeigen | … | makemv delim="," recipients | top recipients |
Neue Ergebnisse für jeden Wert des Multiwertfelds „recipients“ erstellen | … | mvexpand recipients |
Anzahl der Empfängerwerte ermitteln | … | eval to_count = mvcount(recipients) |
Erste E-Mail-Adresse im Empfängerfeld („recipients“) finden | … | eval recipient_first = mvindex(recipient,0) |
Alle „recipient“-Werte finden, die mit .net oder .org enden | … | eval netorg_ recipients = mvfilter match(recipient,"\.net$") OR match(recipient,"\.org$")) |
Index des ersten Empfängerwerts finden, der mit “\.org$” übereinstimmt | … | eval orgindex = mvfind(recipient, "\.org$") |
Häufige Datums- und Zeitformate | ||
Diese Werte verwendet ihr für die Eval-Funktionen strftime() und strptime() und für Zeitstempel von Ereignisdaten. | ||
Zeit | %H | 24 Stunden (führende Nullen) (00 bis 23) |
%I | 12 Stunden (führende Nullen) (01 bis 12) | |
%M | Minute (00 bis 59) | |
%S | Sekunde (00 bis 61) | |
%N | Subsekunden mit Größenangabe (%3N = Millisekunden, %6N = Mikrosekunden, %9N = Nanosekunden) | |
%p | AM oder PM | |
%Z | Zeitzone (CET) | |
%z | Zeitzonenabweichung von der UTC in Stunden und Minuten: +hhmm oder -hhmm (+0100 für CET) | |
%s | Sekunden seit dem 01.01.1970 (1308677092) | |
Tage | %d | Tag des Monats (führende Nullen) (01 bis 31) |
%j | Tag des Jahres (001 bis 366) | |
%w | Wochentag (0 bis 6) | |
%a | Abgekürzter Wochentag (So) | |
%A | Wochentag (Sonntag) | |
Monate | %b | Abgekürzter Monatsname (Jan) |
%B | Monatsname (Januar) | |
%m | Monatsnummer (01 bis 12) | |
Jahre | %y | Jahr ohne Jahrhundert (00 bis 99) |
%Y | Jahr (2021) | |
Beispiele | %Y-%m-%d | 2021-12-31 |
%y-%m-%d | 21-12-31 | |
%b %d, %Y | Jan 24, 2021 | |
%B %d, %Y | Januar 24, 2021 | |
q|%d %b '%y= %Y-%m-%d | q|25 Feb '21 = 2021-02-25| |
Ihr habt einen Fehler entdeckt oder eine Anregung? Bitte lasst es uns wissen und schreibt eine E-Mail an ssg-blogs@splunk.com.
Dieser Beitrag spiegelt nicht zwingend die Position, Strategie oder Meinung von Splunk wider.
Weltweit führende Unternehmen verlassen sich auf Splunk, ein Cisco-Unternehmen, um mit unserer Plattform für einheitliche Sicherheit und Observability, die auf branchenführender KI basiert, kontinuierlich ihre digitale Resilienz zu stärken.
Unsere Kunden vertrauen auf die preisgekrönten Security- und Observability-Lösungen von Splunk, um ihre komplexen digitalen Umgebungen ungeachtet ihrer Größenordnung zuverlässig zu sichern und verbessern.