Analysieren von Textdaten in Azure Monitor-Protokollen

Einige von Azure Monitor gesammelte Protokolldaten umfassen mehrere Arten von Informationen in einer einzelnen Eigenschaft. Das Analysieren dieser Daten in mehrere Eigenschaften erleichtert die Verwendung in Abfragen. Ein gängiges Beispiel ist ein benutzerdefiniertes Protokoll, das einen kompletten Protokolleintrag mit mehreren Werten in einer einzelnen Eigenschaft sammelt. Durch die Erstellung separater Eigenschaften für die verschiedenen Werte können Sie nach den einzelnen Eigenschaften suchen und sie aggregieren.

In diesem Artikel werden verschiedene Optionen zum Analysieren von Protokolldaten in Azure Monitor beschrieben, wenn die Daten erfasst sowie in einer Abfrage abgerufen werden, wobei jeweils ein Vergleich der relativen Vorteile erfolgt.

Erforderliche Berechtigungen

  • Um Daten zur Erfassungszeit zu analysieren, benötigen Sie Berechtigungen vom Typ Microsoft.Insights/dataCollectionRuleAssociations/*, wie sie beispielsweise von der integrierten Rolle „Log Analytics-Mitwirkender“ bereitgestellt werden.
  • Um Daten zur Abfragezeit zu analysieren, benötigen Sie Berechtigungen vom Typ Microsoft.OperationalInsights/workspaces/query/*/read, wie sie beispielsweise von der integrierten Rolle „Log Analytics-Leser“ bereitgestellt werden.

Analysemethoden

Sie können Daten entweder zum Erfassungs- oder zum Abfragezeitpunkt analysieren, wenn Sie die Daten mit einer Abfrage analysieren. Jede Strategie hat spezifische Vorteile.

Analysieren von Daten zum Sammlungszeitpunkt

Verwenden Sie Transformationen, um Daten zur Erfassungszeit zu analysieren und zu definieren, an welche Spalten die analysierten Daten gesendet werden sollen.

Vorteile:

  • Die Abfrage der gesammelten Daten ist einfacher, da Sie keine Analysebefehle in die Abfrage einbeziehen müssen.
  • Bessere Abfrageleistung, da die Abfrage nicht analysiert werden muss.

Nachteile:

  • Die Definition muss im Voraus erfolgen. Bereits gesammelte Daten können nicht einbezogen werden.
  • Wenn Sie die Analyselogik ändern, gilt sie nur für neue Daten.
  • Erhöht die Wartezeit für die Datensammlung.
  • Fehler sind möglicherweise schwer zu beheben.

Analysieren von Daten zum Abfragezeitpunkt

Wenn Sie Daten zur Abfragezeit analysieren, beziehen Sie die Logik in Ihre Abfrage ein, um Daten in mehreren Feldern zu analysieren. Die eigentliche Tabelle wird nicht geändert.

Vorteile:

  • Gilt für beliebige Daten, einschließlich der bereits gesammelten Daten.
  • Änderungen an der Logik können sofort auf alle Daten angewendet werden.
  • Flexible Analyseoptionen, einschließlich vordefinierter Logik für bestimmte Datenstrukturen.

Nachteile:

  • Erfordert komplexere Abfragen. Dieser Nachteil kann mithilfe von Funktionen zur Simulation einer Tabelle gemindert werden.
  • Die Analyselogik muss in mehreren Abfragen repliziert werden. Ein Teil der Logik kann durch Funktionen freigegeben werden.
  • Bei der Ausführung komplexer Logik für eine sehr große Anzahl von Datensätzen (in der Größenordnung mehrerer Milliarden) kann sich ein Mehraufwand ergeben.

Analysieren von Daten beim Sammeln

Weitere Informationen zum Analysieren von Daten während der Erfassung finden Sie unter Struktur von Transformationen in Azure Monitor. Durch diesen Ansatz werden benutzerdefinierte Eigenschaften in der Tabelle erstellt, die wie jede andere Eigenschaft von Abfragen verwendet werden können.

Analysieren von Daten in Abfragen mithilfe von Mustern

Wenn die zu analysierenden Daten durch ein Muster identifiziert werden können, das sich über Datensätze hinweg wiederholt, können Sie verschiedene Operatoren in der Abfragesprache Kusto verwenden, um den betreffenden Teil der Daten in eine oder mehrere neue Eigenschaften zu extrahieren.

Einfache Textmuster

Verwenden Sie den parse-Operator in Ihrer Abfrage, um eine oder mehrere benutzerdefinierte Eigenschaften zu erstellen, die aus einem Zeichenfolgenausdruck extrahiert werden können. Sie geben das zu identifizierende Muster und die Namen der zu erstellenden Eigenschaften an. Dieser Ansatz ist für Daten mit Schlüssel-Wert-Zeichenfolgen nützlich, die eine Form wie key=value aufweisen.

Stellen Sie sich ein benutzerdefiniertes Protokoll mit Daten im folgenden Format vor:

Time=2018-03-10 01:34:36 Event Code=207 Status=Success Message=Client 05a26a97-272a-4bc9-8f64-269d154b0e39 connected
Time=2018-03-10 01:33:33 Event Code=208 Status=Warning Message=Client ec53d95c-1c88-41ae-8174-92104212de5d disconnected
Time=2018-03-10 01:35:44 Event Code=209 Status=Success Message=Transaction 10d65890-b003-48f8-9cfc-9c74b51189c8 succeeded
Time=2018-03-10 01:38:22 Event Code=302 Status=Error Message=Application could not connect to database
Time=2018-03-10 01:31:34 Event Code=303 Status=Error Message=Application lost connection to database

Die folgende Abfrage würde diese Daten als einzelne Eigenschaften analysieren. Die Zeile mit project wird hinzugefügt, um nur die berechneten Eigenschaften und nicht RawData – die einzelne Eigenschaft, die den gesamten Eintrag aus dem benutzerdefinierten Protokoll enthält – zurückzugeben.

MyCustomLog_CL
| parse RawData with * "Time=" EventTime " Event Code=" Code " Status=" Status " Message=" Message
| project EventTime, Code, Status, Message

Dieses Beispiel gibt den Benutzernamen eines Benutzerprinzipalnamens in der Tabelle AzureActivity aus.

AzureActivity
| parse  Caller with UPNUserPart "@" * 
| where UPNUserPart != "" //Remove non UPN callers (apps, SPNs, etc)
| distinct UPNUserPart, Caller

Reguläre Ausdrücke

Wenn Ihre Daten durch einen regulären Ausdruck identifiziert werden können, können Sie mithilfe von Funktionen, die reguläre Ausdrücke verwenden, einzelne Werte extrahieren. Das folgende Beispiel verwendet extract, um das Feld UPN aus AzureActivity-Datensätzen herauszufiltern und dann verschiedene Benutzer zurückzugeben.

AzureActivity
| extend UPNUserPart = extract("([a-z.]*)@", 1, Caller) 
| distinct UPNUserPart, Caller

Um eine effiziente Analyse im großen Umfang zu ermöglichen, verwendet Azure Monitor die re2-Version von Regular Expressions, die einigen der anderen Varianten von Regular Expressions ähnelt, aber nicht mit ihnen identisch ist. Weitere Informationen finden Sie in der re2-Ausdruckssyntax.

Analysieren von durch Trennzeichen getrennten Daten in einer Abfrage

Durch Trennzeichen getrennte Daten trennen Felder mit einem allgemeinen Zeichen (z. B. ein Komma) in einer CSV-Datei. Verwenden Sie die split-Funktion, um durch Trennzeichen getrennte Daten zu analysieren, indem Sie ein von Ihnen angegebenes Trennzeichen verwenden. Sie können diesen Ansatz mit dem Operator extend verwenden, um alle Felder in den Daten zurückzugeben oder um einzelne Felder anzugeben, die in die Ausgabe einbezogen werden sollen.

Hinweis

Da „split“ ein dynamisches Objekt zurückgibt, müssen die Ergebnisse möglicherweise explizit in Datentypen wie Zeichenfolgen umgewandelt werden, die in Operatoren und Filtern verwendet werden.

Stellen Sie sich ein benutzerdefiniertes Protokoll mit Daten im folgenden CSV-Format vor:

2018-03-10 01:34:36, 207,Success,Client 05a26a97-272a-4bc9-8f64-269d154b0e39 connected
2018-03-10 01:33:33, 208,Warning,Client ec53d95c-1c88-41ae-8174-92104212de5d disconnected
2018-03-10 01:35:44, 209,Success,Transaction 10d65890-b003-48f8-9cfc-9c74b51189c8 succeeded
2018-03-10 01:38:22, 302,Error,Application could not connect to database
2018-03-10 01:31:34, 303,Error,Application lost connection to database

Die folgende Abfrage würde diese Daten analysieren und für zwei der berechneten Eigenschaften zusammenfassen. Die erste Zeile unterteilt die RawData-Eigenschaft in ein Zeichenfolgenarray. Jede der folgenden Zeilen weist den einzelnen Eigenschaften einen Namen zu und fügt sie der Ausgabe mithilfe von Funktionen hinzu, um sie in den entsprechenden Datentyp zu konvertieren.

MyCustomCSVLog_CL
| extend CSVFields  = split(RawData, ',')
| extend EventTime  = todatetime(CSVFields[0])
| extend Code       = toint(CSVFields[1]) 
| extend Status     = tostring(CSVFields[2]) 
| extend Message    = tostring(CSVFields[3]) 
| where getyear(EventTime) == 2018
| summarize count() by Status,Code

Analysieren vordefinierter Strukturen in einer Abfrage

Wenn Ihre Daten in einer bekannten Struktur formatiert sind, können Sie möglicherweise eine der Funktionen in der Abfragesprache Kusto zum Analysieren vordefinierter Strukturen verwenden:

Die folgende Beispielabfrage analysiert das Feld Properties der Tabelle AzureActivity, die im JSON-Format strukturiert ist. Sie speichert die Ergebnisse in einer dynamischen Eigenschaft namens parsedProp, die den individuell benannten Wert im JSON-Format enthält. Diese Werte werden verwendet, um die Abfrageergebnisse zu filtern und zusammenzufassen.

AzureActivity
| extend parsedProp = parse_json(Properties) 
| where parsedProp.isComplianceCheck == "True" 
| summarize count() by ResourceGroup, tostring(parsedProp.tags.businessowner)

Diese Analysefunktionen können prozessorintensiv sein. Verwenden Sie sie nur, wenn Ihre Abfrage mehrere Eigenschaften aus den formatierten Daten verwendet. Andernfalls ist die einfache Musterabgleichsverarbeitung schneller.

Das folgende Beispiel zeigt die Aufschlüsselung des Domänencontrollers vom Typ TGT Preauth. Der Typ existiert nur in dem Feld EventData, das eine XML-Zeichenfolge ist. Es sind keine weiteren Daten aus diesem Feld erforderlich. In diesem Fall wird parse verwendet, um die erforderlichen Daten auszuwählen.

SecurityEvent
| where EventID == 4768
| parse EventData with * 'PreAuthType">' PreAuthType '</Data>' * 
| summarize count() by PreAuthType

Verwenden einer Funktion zum Simulieren einer Tabelle

Sie verfügen möglicherweise über mehrere Abfragen, die eine bestimmte Tabelle auf dieselbe Weise analysieren. In diesem Fall erstellen Sie eine Funktion, die die analysierten Daten zurückgibt, anstatt die Analyselogik in den einzelnen Abfragen zu replizieren. Sie können dann in anderen Abfragen den Aliasnamen der Funktion anstelle der ursprünglichen Tabelle verwenden.

Betrachten Sie das vorangehende Beispiel für das benutzerdefinierte Protokoll, das Kommas als Trennzeichen verwendet. Damit die analysierten Daten in mehreren Abfragen verwendet werden können, erstellen Sie eine Funktion mit der folgenden Abfrage, und speichern Sie sie mit dem Aliasnamen MyCustomCSVLog.

MyCustomCSVLog_CL
| extend CSVFields = split(RawData, ',')
| extend DateTime  = tostring(CSVFields[0])
| extend Code      = toint(CSVFields[1]) 
| extend Status    = tostring(CSVFields[2]) 
| extend Message   = tostring(CSVFields[3]) 

Sie können jetzt den Aliasnamen MyCustomCSVLog anstelle des eigentlichen Tabellennamens in Abfragen wie im folgenden Beispiel verwenden:

MyCustomCSVLog
| summarize count() by Status,Code

Nächste Schritte

Erfahren Sie mehr über Protokollabfragen zum Analysieren der aus Datenquellen und Lösungen gesammelten Daten.