Erste Schritte mit Protokollabfragen in Azure Monitor

Hinweis

Wenn Sie Daten von mindestens einem virtuellen Computer sammeln, können Sie diese Übung in Ihrer eigenen Umgebung durcharbeiten. Wenn nicht, verwenden Sie die Demoumgebung, die eine Vielzahl von Beispieldaten enthält.

Wenn Sie bereits wissen, wie Sie Abfragen in Kusto-Abfragesprache (Kusto Query Language, KQL) ausführen, aber schnell nützliche Abfragen auf Grundlage von Ressourcentypen erstellen müssen, finden Sie weitere Informationen im Bereich mit den gespeicherten Beispielabfragen unter Verwenden von Abfragen in Azure Monitor Log Analytics.

In diesem Tutorial lernen Sie, wie Sie Protokollabfragen in Azure Monitor schreiben. In diesem Artikel wird Folgendes vermittelt:

  • Grundlegendes zur Abfragestruktur.
  • Sortieren von Abfrageergebnissen.
  • Filtern von Abfrageergebnissen.
  • Festlegen eines Zeitbereichs.
  • Auswählen der Felder, die in den Ergebnissen enthalten sein sollen.
  • Definieren und Verwenden von benutzerdefinierten Feldern.
  • Aggregieren und Gruppieren von Ergebnissen.

Ein Tutorial zur Verwendung von Log Analytics im Azure-Portal finden Sie unter Erste Schritte mit Azure Monitor Log Analytics.

Weitere Informationen zu Protokollabfragen in Azure Monitor finden Sie unter Übersicht über Protokollabfragen in Azure Monitor.

Hier finden Sie eine Videoversion dieses Tutorials:

Erforderliche Berechtigungen

Sie müssen über Microsoft.OperationalInsights/workspaces/query/*/read-Berechtigungen für die Log Analytics-Arbeitsbereiche verfügen, die Sie abfragen, wie sie z. B. von der integrierten Log Analytics-Reader-Rolle bereitgestellt werden.

Schreiben einer neuen Abfrage

Abfragen können entweder mit einem Tabellennamen oder dem search-Befehl beginnen. Sie sollten mit einem Tabellennamen beginnen, da er einen klaren Gültigkeitsbereich für die Abfrage definiert. Dadurch werden auch die Abfrageleistung und die Relevanz der Ergebnisse verbessert.

Hinweis

Bei der in Azure Monitor verwendeten Abfragesprache KQL wird die Groß-/Kleinschreibung beachtet. Sprachschlüsselwörter werden in der Regel in Kleinbuchstaben geschrieben. Verwenden Sie die richtige Schreibweise bei Tabellen- oder Spaltennamen in einer Abfrage, wie im Schemabereich angezeigt wird.

Tabellenbasierte Abfragen

In Azure Monitor werden Protokolldaten in Tabellen bestehend aus mehreren Spalten organisiert. Alle Tabellen und Spalten werden im Schemabereich in Log Analytics im Analytics-Portal angezeigt. Identifizieren Sie eine Tabelle, die Sie interessiert, und untersuchen Sie dann einen Teil der Daten:

SecurityEvent
| take 10

Die vorangehende Abfrage gibt in keiner bestimmten Reihenfolge 10 Ergebnisse aus der SecurityEvent-Tabelle zurück. Mithilfe dieser gängigen Methode können Sie sich einen Überblick über eine Tabelle verschaffen und sich mit deren Struktur und Inhalt vertraut machen. Werfen wir einen Blick darauf, wie sie erstellt wird:

  • Die Abfrage beginnt mit dem Tabellennamen SecurityEvent, der den Gültigkeitsbereich der Abfrage definiert.

  • Der senkrechte Strich (|) trennt Befehle, d. h. die Ausgabe des ersten Befehls ist die Eingabe für den nächsten. Sie können eine beliebige Anzahl von durch senkrechte Striche getrennten Elementen hinzufügen.

  • Nach dem Pipe ist der take Operator.

    Wir könnten die Abfrage auch ohne Hinzufügen von | take 10 ausführen. Der Befehl wäre weiterhin gültig, könnte aber bis zu 30 000 Ergebnisse zurückgeben.

Take

Verwenden Sie den take Operator , um ein kleines Beispiel von Datensätzen anzuzeigen, indem Sie bis zur angegebenen Anzahl von Datensätzen zurückkehren. Die ausgewählten Ergebnisse sind beliebig und werden in keiner bestimmten Reihenfolge angezeigt. Wenn Sie Ergebnisse in einer bestimmten Reihenfolge zurückgeben müssen, verwenden Sie die sort Operatoren.top

Suchabfragen

Suchabfragen sind weniger strukturiert. Sie sind besser für die Suche nach Datensätzen geeignet, die einen bestimmten Wert in einer der Spalten enthalten:

search in (SecurityEvent) "Cryptographic"
| take 10

Diese Abfrage durchsucht die Tabelle SecurityEvent nach Datensätzen, die den Ausdruck „Cryptographic“ enthalten. Von diesen Datensätzen werden 10 zurückgegeben und angezeigt. Wenn Sie den Teil in (SecurityEvent) auslassen und nur search "Cryptographic" ausführen, werden alle Tabellen durchsucht. Der Prozess würde dann länger dauern und weniger effizient sein.

Wichtig

Suchabfragen sind üblicherweise langsamer als tabellengestützte Abfragen, da sie mehr Daten verarbeiten müssen.

„sort“ und „top“

In diesem Abschnitt werden die sort Operatoren und top ihre desc Argumente beschrieben asc . Obwohl take es nützlich ist, einige Datensätze zu erhalten, können Sie die Ergebnisse nicht in einer bestimmten Reihenfolge auswählen oder sortieren. Um eine sortierte Ansicht zu erhalten, verwenden sort Sie und top.

Desc und asc

Desc

Verwenden Sie das desc Argument, um Datensätze in absteigender Reihenfolge zu sortieren. Absteigend ist die Standardsortierreihenfolge für sort und top, sodass Sie das desc Argument normalerweise weglassen können.

Die von beiden folgenden Abfragen zurückgegebenen Daten werden beispielsweise nach der Spalte "TimeGenerated" in absteigender Reihenfolge sortiert:

  • SecurityEvent	
    | sort by TimeGenerated desc
    
  • SecurityEvent	
    | sort by TimeGenerated
    

Asc

Geben Sie ascan, um in aufsteigender Reihenfolge zu sortieren.

Sort

Sie können den sort Operator verwenden. sort sortiert die Abfrageergebnisse nach der von Ihnen angegebenen Spalte. Beschränkt jedoch nicht die Anzahl der Datensätze, sort die von der Abfrage zurückgegeben werden.

Die folgende Abfrage gibt beispielsweise alle verfügbaren Datensätze für die SecurityEvent Tabelle zurück, die maximal 30.000 Datensätze beträgt, und sortiert sie nach der Spalte "TimeGenerated".

SecurityEvent	
| sort by TimeGenerated

Die vorherige Abfrage kann zu viele Ergebnisse zurückgeben. Außerdem kann es einige Zeit dauern, bis die Ergebnisse zurückgegeben werden. Die Abfrage sortiert die gesamte Tabelle SecurityEvent nach der Spalte TimeGenerated. Das Analytics-Portal beschränkt die Anzeige dann auf lediglich 30 000 Datensätze. Dieser Ansatz ist nicht optimal. Die beste Möglichkeit, nur die neuesten Datensätze abzurufen, besteht darin, den top Operator zu verwenden.

TOP

Verwenden Sie den top Operator , um die gesamte Tabelle auf der Serverseite zu sortieren und dann nur die obersten Datensätze zurückzugeben.

Die folgende Abfrage gibt beispielsweise die neuesten 10 Datensätze zurück:

SecurityEvent
| top 10 by TimeGenerated

Die Ausgabe sieht wie im folgenden Beispiel aus.

Screenshot that shows the top 10 records sorted in descending order.

Der „where“-Operator: Filtern nach einer Bedingung

Wie der Name schon angibt, filtern Filter die Daten nach einer bestimmten Bedingung. Filtern ist die gängigste Methode, um Abfrageergebnisse auf relevante Informationen zu beschränken.

Um einer Abfrage einen Filter hinzuzufügen, verwenden Sie den where Operator gefolgt von einer oder mehreren Bedingungen. Die folgende Abfrage gibt beispielsweise nur SecurityEvent-Datensätze zurück, bei denen Level equals _8 zutrifft:

SecurityEvent
| where Level == 8

Beim Schreiben von Filterbedingungen können Sie folgende Ausdrücke verwenden:

Ausdruck BESCHREIBUNG Beispiel
== Überprüfung auf Gleichheit
(mit Berücksichtigung der Groß-/Kleinschreibung)
Level == 8
=~ Überprüfung auf Gleichheit
(ohne Berücksichtigung der Groß-/Kleinschreibung)
EventSourceName =~ "microsoft-windows-security-auditing"
!=, <> Überprüfung auf Ungleichheit
(beide Ausdrücke sind identisch)
Level != 4
and, or Zwischen Bedingungen erforderlich Level == 16 or CommandLine != ""

Um nach mehreren Bedingungen zu filtern, können Sie einen der folgenden Ansätze verwenden:

Verwenden Sie and (und), wie hier gezeigt:

SecurityEvent
| where Level == 8 and EventID == 4672

Übergeben Sie hintereinander mehrere where-Elemente per Pipe, wie hier gezeigt:

SecurityEvent
| where Level == 8 
| where EventID == 4672

Hinweis

Werte können unterschiedliche Typen aufweisen. Deshalb müssen sie eventuell umgewandelt werden, damit ein Vergleich für den richtigen Typ ausgeführt werden kann. Die Spalte SecurityEvent Level ist beispielsweise vom Typ „String“. Sie müssen daher eine Umwandlung in einen numerischen Typ wie int oder long durchführen, bevor Sie numerische Operatoren für diese verwenden können, wie hier gezeigt: SecurityEvent | where toint(Level) >= 10

Festlegen eines Zeitbereichs

Sie können einen Zeitbereich angeben, indem Sie die Zeitauswahl oder einen Zeitfilter verwenden.

Verwenden der Zeitauswahl

Die Zeitauswahl wird neben der Schaltfläche Ausführen angezeigt und zeigt an, dass Sie nur Datensätze aus den letzten 24 Stunden abfragen. Dieser Standardzeitbereich wird auf alle Abfragen angewendet. Um nur Datensätze aus der letzten Stunde zu erhalten, wählen Sie Letzte Stunde aus, und führen Sie dann die Abfrage erneut aus.

Screenshot that shows the time picker and its list of time-range commands.

Hinzufügen eines Filters zur Abfrage

Sie können auch einen eigenen Zeitbereich definieren, indem Sie einen Zeitfilter zur Abfrage hinzufügen. Durch Hinzufügen eines Zeitfilters wird der in der Zeitauswahl ausgewählte Zeitraum außer Kraft gesetzt.

Der Zeitfilter sollte idealerweise unmittelbar nach dem Tabellennamen platziert werden:

SecurityEvent
| where TimeGenerated > ago(30m) 
| where toint(Level) >= 10

Im vorherigen Zeitfilter bedeutet ago(30m) „vor 30 Minuten“. Diese Abfrage gibt nur die Datensätze der letzten 30 Minuten zurück, was z. B. als „30 m“ ausgedrückt wird. Andere Zeiteinheiten umfassen Tage (z. B. 2d) und Sekunden (z. B. 10s).

Verwenden von „project“ und „extend“ zum Auswählen und Berechnen von Spalten

Mit project können Sie bestimmte Spalten zur Einbeziehung in die Ergebnisse auswählen:

SecurityEvent 
| top 10 by TimeGenerated 
| project TimeGenerated, Computer, Activity

Das Beispiel oben generiert die folgende Ausgabe:

Screenshot that shows the query 'project' results list.

Sie können über project auch Spalten umbenennen und neue definieren. Im nächsten Beispiel wird mit project Folgendes ausgeführt:

  • Wählen Sie nur die ursprünglichen Spalten Computer und TimeGenerated aus.
  • Zeigen Sie die Spalte Activity als EventDetails an.
  • Erstellen Sie eine neue Spalte mit dem Namen EventCode. Die Funktion substring() wird verwendet, um nur die ersten vier Zeichen aus dem Feld Activity abzurufen.
SecurityEvent
| top 10 by TimeGenerated 
| project Computer, TimeGenerated, EventDetails=Activity, EventCode=substring(Activity, 0, 4)

Sie können extend verwenden, um alle ursprünglichen Spalten im Resultset beizubehalten und weitere zu definieren. Die folgende Abfrage verwendet extend zum Hinzufügen der Spalte EventCode. Diese Spalte wird möglicherweise nicht am Ende der Tabellenergebnisse angezeigt. Zum Anzeigen müssen Sie die Details eines Datensatzes erweitern.

SecurityEvent
| top 10 by TimeGenerated
| extend EventCode=substring(Activity, 0, 4)

Verwenden von „summarize“ zum Aggregieren von Zeilengruppen

Verwenden Sie summarize, um Gruppen von Datensätzen entsprechend einer oder mehrerer Spalten zu identifizieren und Aggregationen auf diese anzuwenden. Am häufigsten wird summarize mit count verwendet, womit die Anzahl von Ergebnissen in jeder Gruppe zurückgegeben wird.

Die folgende Abfrage überprüft alle Perf-Datensätze aus der letzten Stunde, gruppiert diese nach ObjectName und zählt die Datensätze in jeder Gruppe:

Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName

Manchmal ist es sinnvoll, Gruppen nach mehreren Dimensionen zu definieren. Jede eindeutige Kombination der folgenden Werte definiert eine separate Gruppe:

Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName, CounterName

Auch die Ausführung von mathematischen oder statistischen Berechnungen für jede Gruppe ist ein häufiger Anwendungsfall. Im folgenden Beispiel wird der durchschnittliche CounterValue für jeden Computer berechnet:

Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer

Die Ergebnisse dieser Abfrage sind jedoch bedeutungslos, da verschiedene Leistungsindikatoren vermischt wurden. Um die Ergebnisse aussagekräftiger zu gestalten, berechnen Sie den Mittelwert separat für jede Kombination von CounterName und Computer:

Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer, CounterName

Zusammenfassen nach einer Zeitspalte

Die Gruppierung von Ergebnissen kann auch auf einer Zeitspalte oder einem anderen kontinuierlichen Wert basieren. Durch das bloße Zusammenfassen von by TimeGenerated würden Gruppen für jede einzelne Millisekunde für den Zeitbereich erstellt werden, da diese Werte eindeutig sind.

Zum Erstellen von Gruppen, die auf kontinuierlichen Werten basieren, wird empfohlen, den Bereich mittels bin in verwaltbare Einheiten zu unterteilen. Die folgende Abfrage analysiert Perf-Datensätze, die den freien Arbeitsspeicher (Available MBytes) auf einem bestimmten Computer ermitteln. Sie berechnet den Durchschnittswert für jeden Zeitraum von einer Stunde über die letzten sieben Tage:

Perf 
| where TimeGenerated > ago(7d)
| where Computer == "ContosoAzADDS2" 
| where CounterName == "Available MBytes" 
| summarize avg(CounterValue) by bin(TimeGenerated, 1h)

Um die Ausgabe übersichtlicher zu gestalten, können Sie das jeweilige Zeitdiagramm auswählen, das den verfügbaren Arbeitsspeicher im zeitlichen Verlauf darstellt.

Screenshot that shows the values of a query memory over time.

Häufig gestellte Fragen

Dieser Abschnitt enthält Antworten auf häufig gestellte Fragen.

Warum werden mir in Azure Monitor-Protokollen doppelte Datensätze angezeigt?

Gelegentlich bemerken Sie vielleicht doppelte Datensätze in Azure Monitor-Protokollen. Diese Duplizierung erfolgt in der Regel aufgrund eines der folgenden zwei Zustände:

  • Komponenten in der Pipeline verfügen über Wiederholungsversuche, um eine zuverlässige Bereitstellung am Ziel sicherzustellen. Gelegentlich kann diese Funktion zu Duplikaten für einen kleinen Prozentsatz von Telemetrieelementen führen.
  • Wenn die doppelten Datensätze von einem virtuellen Computer stammen, ist möglicherweise sowohl der Log Analytics-Agent als auch Azure Monitor Agent installiert. Wenn Sie den Log Analytics-Agent weiterhin installieren müssen, konfigurieren Sie den Log Analytics-Arbeitsbereich so, dass keine Daten mehr gesammelt werden, die auch von der Datensammlungsregel erfasst werden, die von Azure Monitor Agent verwendet wird.

Nächste Schritte