Erste Schritte mit Protokollabfragen in Azure MonitorGet started with log queries in Azure Monitor

Hinweis

Sie können diese Übung in Ihrer eigenen Umgebung durcharbeiten, wenn Sie Daten von mindestens einem virtuellen Computer sammeln.You can work through this exercise in your own environment if you are collecting data from at least one virtual machine. Andernfalls verwenden Sie die Demoumgebung, die eine Vielzahl von Beispieldaten enthält.If not then use our Demo environment, which includes plenty of sample data.

In diesem Tutorial erfahren Sie, wie Sie Protokollabfragen in Azure Monitor schreiben.In this tutorial you will learn to write log queries in Azure Monitor. Es wird Folgendes vermittelt:It will teach you how to:

  • Grundlegendes zur AbfragestrukturUnderstand query structure
  • Sortieren von AbfrageergebnissenSort query results
  • Filtern von AbfrageergebnissenFilter query results
  • Festlegen eines ZeitbereichsSpecify a time range
  • Auswählen der Felder, die in den Ergebnissen enthalten sein sollenSelect which fields to include in the results
  • Definieren und Verwenden von benutzerdefinierten FeldernDefine and use custom fields
  • Aggregieren und Gruppieren von ErgebnissenAggregate and group results

Ein Tutorial zur Verwendung von Log Analytics im Azure-Portal finden Sie unter Erste Schritte mit Azure Monitor Log Analytics.For a tutorial on using Log Analytics in the Azure portal, see Get started with Azure Monitor Log Analytics.
Weitere Informationen zu Protokollabfragen in Azure Monitor finden Sie unter Übersicht über Protokollabfragen in Azure Monitor.For more details on log queries in Azure Monitor, see Overview of log queries in Azure Monitor.

Sehen Sie sich die Videoversion dieses Tutorials an:Follow along with a video version of this tutorial below:

Schreiben einer neuen AbfrageWriting a new query

Abfragen können entweder mit einem Tabellennamen oder dem search-Befehl beginnen.Queries can start with either a table name or the search command. Sie sollten mit einem Tabellennamen beginnen, da er einen klaren Gültigkeitsbereich für die Abfrage definiert und die Abfrageleistung und -relevanz der Ergebnisse verbessert.You should start with a table name, since it defines a clear scope for the query and improves both query performance and relevance of the results.

Hinweis

Bei der in Azure Monitor verwendeten Abfragesprache Kusto wird die Groß-/Kleinschreibung berücksichtigt.The Kusto query language used by Azure Monitor is case-sensitive. Programmiersprachen-Schlüsselwörter werden in der Regel in Kleinbuchstaben geschrieben.Language keywords are typically written in lower-case. Verwenden Sie die richtige Schreibweise bei Tabellen- oder Spaltennamen in einer Abfrage, wie im Schemabereich angezeigt wird.When using names of tables or columns in a query, make sure to use the correct case, as shown on the schema pane.

Tabellenbasierte AbfragenTable-based queries

In Azure Monitor werden Protokolldaten in Tabellen bestehend aus mehreren Spalten organisiert.Azure Monitor organizes log data in tables, each composed of multiple columns. Alle Tabellen und Spalten werden im Schemabereich in Log Analytics im Analytics-Portal angezeigt.All tables and columns are shown on the schema pane in Log Analytics in the Analytics portal. Identifizieren Sie eine Tabelle, die Sie interessiert, und untersuchen Sie dann einen Teil der Daten:Identify a table that you're interested in and then take a look at a bit of data:

SecurityEvent
| take 10

Die oben gezeigte Abfrage gibt in keiner bestimmten Reihenfolge 10 Ergebnisse aus der SecurityEvent-Tabelle zurück.The query shown above returns 10 results from the SecurityEvent table, in no specific order. Dies ist eine gängige Methode, um eine Tabelle zu untersuchen und sich mit deren Struktur und Inhalt vertraut zu machen.This is a very common way to take a glance at a table and understand its structure and content. Werfen wir einen Blick darauf, wie sie erstellt wird:Let's examine how it's built:

  • Die Abfrage beginnt mit dem Tabellennamen SecurityEvent, dem Teil, der den Gültigkeitsbereich der Abfrage definiert.The query starts with the table name SecurityEvent - this part defines the scope of the query.
  • Der senkrechte Strich (|) trennt Befehle, d.h. die Ausgabe des ersten Befehls in der Eingabe vom folgenden Befehl.The pipe (|) character separates commands, so the output of the first one in the input of the following command. Sie können eine beliebige Anzahl von durch senkrechte Striche getrennten Elementen hinzufügen.You can add any number of piped elements.
  • Nach dem senkrechten Strich folgt der take-Befehl, der eine bestimmte Anzahl von beliebigen Datensätzen aus der Tabelle zurückgibt.Following the pipe is the take command, which returns a specific number of arbitrary records from the table.

Die Abfrage könnte sogar ohne Hinzufügen von | take 10 ausgeführt werden. Dies wäre zwar eine gültige Abfrage, könnte jedoch bis zu 10.000 Ergebnisse zurückgeben.We could actually run the query even without adding | take 10 - that would still be valid, but it could return up to 10,000 results.

SuchabfragenSearch queries

Suchabfragen sind weniger strukturiert und in der Regel besser geeignet für die Suche nach Datensätzen, die einen bestimmten Wert in einer der Spalten enthalten:Search queries are less structured, and generally more suited for finding records that include a specific value in any of their columns:

search in (SecurityEvent) "Cryptographic"
| take 10

Diese Abfrage sucht die SecurityEvent-Tabelle für Datensätze, die den Ausdruck „Cryptographic“ enthalten.This query searches the SecurityEvent table for records that contain the phrase "Cryptographic". Von diesen Datensätzen werden 10 Datensätze zurückgegeben und angezeigt.Of those records, 10 records will be returned and displayed. Wenn wir den Teil in (SecurityEvent) auslassen und nur search "Cryptographic" ausführen, geht die Suche alle Tabellen durch, was mehr Zeit in Anspruch nehmen würde und weniger effizient wäre.If we omit the in (SecurityEvent) part and just run search "Cryptographic", the search will go over all tables, which would take longer and be less efficient.

Warnung

Suchabfragen sind in der Regel langsamer als tabellengestützte Abfragen, da sie mehr Daten verarbeiten müssen.Search queries are typically slower than table-based queries because they have to process more data.

„sort“ und „top“Sort and top

Zwar können mit take einige Datensätze abgerufen werden, allerdings werden die Ergebnisse in keiner bestimmten Reihenfolge ausgewählt und angezeigt.While take is useful to get a few records, the results are selected and displayed in no particular order. Um eine sortierte Ansicht zu erhalten, können Sie diese nach der bevorzugten Spalte sortieren:To get an ordered view, you could sort by the preferred column:

SecurityEvent   
| sort by TimeGenerated desc

Dies könnte jedoch zu viele Ergebnisse zurückgeben und ebenfalls einige Zeit dauern.That could return too many results though and might also take some time. Die obige Abfrage sortiert die gesamte SecurityEvent-Tabelle nach der TimeGenerated-Spalte.The above query sorts the entire SecurityEvent table by the TimeGenerated column. Das Analytics-Portal beschränkt die Anzeige dann auf lediglich 10.000 Datensätze.The Analytics portal then limits the display to show only 10,000 records. Dieser Ansatz ist natürlich nicht optimal.This approach is of course not optimal.

Die beste Möglichkeit, nur die letzten 10 Datensätze zu erhalten, besteht darin, top zu verwenden, das die gesamte Tabelle auf der Serverseite sortiert und dann die ersten Datensätze zurückgibt:The best way to get only the latest 10 records is to use top, which sorts the entire table on the server side and then returns the top records:

SecurityEvent
| top 10 by TimeGenerated

Die Standardsortierreihenfolge ist absteigend. Daher wird das desc-Argument in der Regel ausgelassen. Die Ausgabe sieht wie folgt aus:Descending is the default sorting order, so we typically omit the desc argument.The output will look like this:

Die ersten 10 Ergebnisse

where: Filtern nach einer BedingungWhere: filtering on a condition

Wie der Name schon angibt, filtern Filter die Daten nach einer bestimmten Bedingung.Filters, as indicated by their name, filter the data by a specific condition. Dies ist die gängigste Methode, um Abfrageergebnisse auf relevante Informationen zu beschränken.This is the most common way to limit query results to relevant information.

Verwenden Sie zum Hinzufügen eines Filters zu einer Abfrage den where-Operator gefolgt von einer oder mehreren Bedingungen.To add a filter to a query, use the where operator followed by one or more conditions. Die folgende Abfrage gibt beispielsweise nur SecurityEvent-Datensätze zurück, bei denen Level 8 entspricht:For example, the following query returns only SecurityEvent records where Level equals 8:

SecurityEvent
| where Level == 8

Beim Schreiben von Filterbedingungen können Sie folgende Ausdrücke verwenden:When writing filter conditions, you can use the following expressions:

AusdruckExpression BESCHREIBUNGDescription BeispielExample
== Überprüfung auf GleichheitCheck equality
(mit Berücksichtigung der Groß-/Kleinschreibung)(case-sensitive)
Level == 8
=~ Überprüfung auf GleichheitCheck equality
(ohne Berücksichtigung der Groß-/Kleinschreibung)(case-insensitive)
EventSourceName =~ "microsoft-windows-security-auditing"
!=, <>!=, <> Überprüfung auf UngleichheitCheck inequality
(beide Ausdrücke sind identisch)(both expressions are identical)
Level != 4
and, orand, or Zwischen Bedingungen erforderlichRequired between conditions Level == 16 or CommandLine != ""

Zum Filtern nach mehreren Bedingungen können Sie einerseits und verwenden:To filter by multiple conditions, you can either use and:

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

Alternativ können Sie hintereinander mehrere where-Elemente übergeben:or pipe multiple where elements one after the other:

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.Values can have different types, so you might need to cast them to perform comparison on the correct type. Die SecurityEvent-Spalte 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: SecurityEvent | where toint(Level) >= 10For example, SecurityEvent Level column is of type String, so you must cast it to a numerical type such as int or long, before you can use numerical operators on it: SecurityEvent | where toint(Level) >= 10

Festlegen eines ZeitbereichsSpecify a time range

ZeitauswahlTime picker

Die Zeitauswahl befindet sich neben der Schaltfläche „Ausführen“ und zeigt an, dass nur Datensätze aus den letzten 24 Stunden abgefragt werden.The time picker is next to the Run button and indicates we’re querying only records from the last 24 hours. Dies ist der Standardzeitbereich, der auf alle Abfragen angewendet wird.This is the default time range applied to all queries. Um nur Datensätze von der letzten Stunde zu erhalten, wählen Sie Letzte Stunde aus und führen die Abfrage erneut aus.To get only records from the last hour, select Last hour and run the query again.

Zeitauswahl

Zeitfilter in AbfragenTime filter in query

Sie können auch einen eigenen Zeitbereich definieren, indem Sie einen Zeitfilter zur Abfrage hinzufügen.You can also define your own time range by adding a time filter to the query. Der Zeitfilter sollte idealerweise unmittelbar nach dem Tabellennamen platziert werden:It’s best to place the time filter immediately after the table name:

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

ago(30m) im oben genannten Zeitfilter bedeutet „vor 30 Minuten“. Diese Abfrage gibt somit nur Datensätze von den letzten 30 Minuten zurück.In the above time filter ago(30m) means "30 minutes ago" so this query only returns records from the last 30 minutes. Andere Zeiteinheiten sind Tage (2d), Minuten (25m) und Sekunden (10s).Other units of time include days (2d), minutes (25m), and seconds (10s).

„project“ und „extend“: Auswählen und Berechnen von SpaltenProject and Extend: select and compute columns

Mit project können Sie bestimmte Spalten zur Einbeziehung in die Ergebnisse auswählen:Use project to select specific columns to include in the results:

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

Im vorherigen Beispiel wird die folgende Ausgabe generiert:The preceding example generates this output:

Abfragen von Projektergebnissen

Sie können über project auch Spalten umbenennen und neue definieren.You can also use project to rename columns and define new ones. Im folgenden Beispiel wird mit „project“ Folgendes ausgeführt:The following example uses project to do the following:

  • Wählen Sie nur die ursprünglichen Spalten Computer und TimeGenerated aus.Select only the Computer and TimeGenerated original columns.
  • Benennen Sie die Spalte Activity in EventDetails um.Rename the Activity column to EventDetails.
  • Erstellen Sie eine neue Spalte mit dem Namen EventCode.Create a new column named EventCode. Die Funktion substring() wird verwendet, um nur die ersten vier Zeichen aus dem Feld „Activity“ abzurufen.The substring() function is used to get only the first four characters from the Activity field.
SecurityEvent
| top 10 by TimeGenerated 
| project Computer, TimeGenerated, EventDetails=Activity, EventCode=substring(Activity, 0, 4)

extend behält alle ursprünglichen Spalten im Resultset bei und definiert weitere Typen.extend keeps all original columns in the result set and defines additional ones. Die folgende Abfrage verwendet extend zum Hinzufügen der Spalte EventCode.The following query uses extend to add the EventCode column. Beachten Sie, dass diese Spalte möglicherweise nicht am Ende der Tabellenergebnisse angezeigt wird. In diesem Fall müssen Sie zum Anzeigen die Details eines Datensatzes erweitern.Note that this column may not display at the end of the table results in which case you would need to expand the details of a record to view it.

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

„summarize“: Aggregieren von ZeilengruppenSummarize: aggregate groups of rows

Identifizieren Sie mit summarize Gruppen von Datensätzen entsprechend einer oder mehrerer Spalten, und wenden Sie Aggregationen auf diese an.Use summarize to identify groups of records, according to one or more columns, and apply aggregations to them. Am häufigsten wird summarize mit count verwendet, womit die Anzahl von Ergebnissen in jeder Gruppe zurückgegeben wird.The most common use of summarize is count, which returns the number of results in each group.

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:The following query reviews all Perf records from the last hour, groups them by ObjectName, and counts the records in each group:

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

Manchmal ist es sinnvoll, Gruppen nach mehreren Dimensionen zu definieren.Sometimes it makes sense to define groups by multiple dimensions. Jede eindeutige Kombination der folgenden Werte definiert eine separate Gruppe:Each unique combination of these values defines a separate group:

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.Another common use is to perform mathematical or statistical calculations on each group. Mit dem folgenden Befehl wird der durchschnittliche CounterValue für jeden Computer berechnet:For example, the following calculates the average CounterValue for each computer:

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

Die Ergebnisse dieser Abfrage sind jedoch bedeutungslos, da verschiedene Leistungsindikatoren vermischt wurden.Unfortunately, the results of this query are meaningless since we mixed together different performance counters. Um diese aussagekräftiger zu gestalten, sollte der Mittelwert separat für jede Kombination von CounterName und Computer berechnet werden:To make this more meaningful, we should calculate the average separately for each combination of CounterName and Computer:

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

Zusammenfassen nach einer ZeitspalteSummarize by a time column

Die Gruppierung von Ergebnissen kann auch auf einer Zeitspalte oder einem anderen kontinuierlichen Wert basieren.Grouping results can also be based on a time column, or another continuous value. Durch das bloße Zusammenfassen von by TimeGenerated würden Gruppen für jede einzelne Millisekunde für den Zeitbereich erstellt werden, da es sich um eindeutige Werte handelt.Simply summarizing by TimeGenerated though would create groups for every single millisecond over the time range, since these are unique values.

Zum Erstellen von Gruppen, die auf kontinuierlichen Werten basieren, wird empfohlen, den Bereich mittels bin in verwaltbare Einheiten zu unterteilen.To create groups based on continuous values, it is best to break the range into manageable units using bin. Die folgende Abfrage analysiert Perf-Datensätze, die den freien Arbeitsspeicher (MBytes) auf einem bestimmten Computer ermitteln.The following query analyzes Perf records that measure free memory (Available MBytes) on a specific computer. Sie berechnet den Durchschnittswert für jeden Zeitraum von einer Stunde über die letzten sieben Tage:It calculates the average value of each 1 hour period over the last 7 days:

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, wählen Sie das jeweilige Zeitdiagramm aus, das den verfügbaren Arbeitsspeicher im Laufe der Zeit darstellt:To make the output clearer, you select to display it as a time-chart, showing the available memory over time:

Abfragen des Speichers über einen Zeitraum

Nächste SchritteNext steps