Bien démarrer avec les requêtes de journal dans Azure Monitor
Notes
Vous pouvez effectuer cet exercice dans votre propre environnement si vous collectez des données à partir d’au moins une machine virtuelle. Pour les autres scénarios, utilisez notre environnement de démonstration, qui comporte de nombreux exemples de données.
Si vous savez déjà comment interroger en langage de requête Kusto (KQL), mais que vous avez besoin de créer rapidement des requêtes efficaces basées sur les types de ressources, consultez le volet des exemples de requêtes enregistrées dans Utiliser des requêtes dans Azure Monitor Log Analytics.
Dans ce didacticiel, vous apprenez à écrire des requêtes de journal dans Azure Monitor. Cet article vous montre comment :
- Comprendre la structure d’une requête.
- Trier les résultats d’une requête.
- Filtrer les résultats d’une requête.
- Spécifier un intervalle de temps.
- Sélectionner les champs à inclure dans les résultats.
- Définir et utiliser des champs personnalisés.
- Agréger et regrouper des résultats.
Pour obtenir un didacticiel sur l’utilisation de Log Analytics dans le portail Azure, consultez Bien démarrer avec Azure Monitor Log Analytics.
Pour plus d’informations sur les requêtes de journal dans Azure Monitor, consultez Vue d’ensemble des requêtes de journal dans Azure Monitor.
Voici une vidéo de tutoriel :
Autorisations requises
Vous devez disposer d’autorisations Microsoft.OperationalInsights/workspaces/query/*/read
dans les espaces de travail Log Analytics que vous interrogez, comme fourni par le rôle intégré de Lecteur Log Analytics, par exemple.
Écrire une nouvelle requête
Les requêtes peuvent commencer par un nom de table ou la commande search
. Il est judicieux de commencer par un nom de table dans la mesure où il définit une étendue précise pour la requête. Il améliore également les performances de la requête et la pertinence des résultats.
Notes
KQL, qui est utilisé par Azure Monitor, respecte la casse. Les mots clés du langage sont généralement écrits en minuscules. Quand vous utilisez des noms de tables ou de colonnes dans une requête, veillez à utiliser la casse adéquate, comme indiqué dans le volet Schéma.
Requêtes basées sur une table
Azure Monitor organise les données de journal en tables, chacune composée de plusieurs colonnes. Toutes les tables et colonnes sont affichées dans le volet Schéma de Log Analytics sur le portail Analytics. Identifiez une table qui vous intéresse et jetez un œil à une partie des données :
SecurityEvent
| take 10
La requête précédente retourne 10 résultats à partir de la table SecurityEvent
, sans ordre spécifique. Cette méthode courante pour obtenir un aperçu d’une table vous aide à comprendre sa structure et son contenu. Examinons la façon dont elle est construite :
La requête commence par le nom de table
SecurityEvent
, qui définit l’étendue de la requête.Le caractère barre verticale (|) sépare les commandes. Ainsi, la sortie de la première commande sert d’entrée à la suivante. Vous pouvez enchaîner un nombre quelconque d’éléments avec le caractère barre verticale.
Après le tuyau se trouve l'
take
opérateur.Nous pourrions exécuter la requête même sans ajouter
| take 10
. La commande serait toujours valide, mais pourrait retourner jusqu’à 30 000 résultats.
Take
Utilisez l' take
opérateur pour afficher un petit échantillon d'enregistrements en renvoyant jusqu'au nombre d'enregistrements spécifié. Les résultats sélectionnés sont arbitraires et affichés sans ordre particulier. Si vous devez renvoyer des résultats dans un ordre particulier, utilisez les sort
et les top
opérateurs.
Requêtes de recherche
Les requêtes de recherche sont moins structurées. Elles sont mieux adaptées pour rechercher des enregistrements qui incluent une valeur spécifique dans une de leurs colonnes :
search in (SecurityEvent) "Cryptographic"
| take 10
Cette requête recherche dans la table SecurityEvent
tous les enregistrements qui contiennent l’expression « Chiffrement ». Parmi ces enregistrements, dix sont retournés et affichés. Si vous omettez la partie in (SecurityEvent)
et exécutez seulement search "Cryptographic"
, la recherche porte sur toutes les tables. Le processus prendrait alors plus de temps et serait moins efficace.
Important
Les requêtes de recherche sont généralement plus lentes que les requêtes basées sur une table car elles doivent traiter plus de données.
Sort et top
Cette section décrit les opérateurs sort
et top
et leurs arguments desc
et asc
. Bien que take
soit utile pour obtenir quelques enregistrements, vous ne pouvez pas sélectionner ou trier les résultats dans un ordre particulier. Pour obtenir une vue ordonnée, utilisez sort
et top
.
Desc et ascendant
Desc
Utilisez l'argument desc
pour trier les enregistrements par ordre décroissant. L'ordre de tri par défaut pour et est décroissant pour sort
et top
, vous pouvez donc généralement omettre l'argument desc
.
Par exemple, les données renvoyées par les deux requêtes suivantes sont triées par la colonne TimeGenerated, par ordre décroissant :
-
SecurityEvent | sort by TimeGenerated desc
-
SecurityEvent | sort by TimeGenerated
Asc
Pour trier par ordre croissant, spécifiez asc
.
Sort
Vous pouvez utiliser l' sort
opérateur. sort
trie les résultats de la requête selon la colonne que vous spécifiez. Cependant, sort
ne limite pas le nombre d'enregistrements renvoyés par la requête.
Par exemple, la requête suivante renvoie tous les enregistrements disponibles pour la table SecurityEvent
, jusqu'à un maximum de 30 000 enregistrements, et les trie par la colonne TimeGenerated.
SecurityEvent
| sort by TimeGenerated
La requête précédente pourrait renvoyer trop de résultats. De plus, l'affichage des résultats peut prendre un certain temps. La requête trie l’ensemble de la table SecurityEvent
en fonction de la colonne TimeGenerated
. Ensuite, le portail Analytics limite l’affichage à seulement 30 000 enregistrements. Cette approche n’est pas optimale. La meilleure façon d’obtenir uniquement les enregistrements les plus récents est d’utiliser l’ top
opérateur.
Haut
Utilisez l' top
opérateur pour trier l'intégralité de la table côté serveur, puis renvoyer uniquement les premiers enregistrements.
Par exemple, la requête suivante renvoie les 10 derniers enregistrements :
SecurityEvent
| top 10 by TimeGenerated
Le résultat ressemble à cet exemple.
Opérateur where : filtre sur une condition
Les filtres, comme leur nom l’indique, filtrent les données en fonction d’une condition spécifique. Le filtrage est la méthode la plus courante pour limiter les résultats d’une requête aux informations pertinentes.
Pour ajouter un filtre à une requête, utilisez l' where
opérateur suivi d'une ou plusieurs conditions. Par exemple, la requête suivante retourne uniquement les enregistrements SecurityEvent
où Level equals _8
:
SecurityEvent
| where Level == 8
Quand vous écrivez des conditions de filtre, vous pouvez utiliser les expressions suivantes :
Expression | Description | Exemple |
---|---|---|
== | Vérifier l’égalité (avec respect de la casse) |
Level == 8 |
=~ | Vérifier l’égalité (sans respect de la casse) |
EventSourceName =~ "microsoft-windows-security-auditing" |
!=, <> | Vérifier l’inégalité (les deux expressions sont identiques) |
Level != 4 |
and , or |
Requis entre les conditions | Level == 16 or CommandLine != "" |
Pour filtrer selon plusieurs conditions, vous pouvez utiliser l’une des approches suivantes :
Utilisez and
, comme illustré ici :
SecurityEvent
| where Level == 8 and EventID == 4672
Enchaînez plusieurs éléments where
avec le caractère barre verticale, comme illustré ici :
SecurityEvent
| where Level == 8
| where EventID == 4672
Notes
Les valeurs pouvant avoir différents types, vous devrez peut-être les caster pour effectuer des comparaisons sur le type correct. Par exemple, la colonne SecurityEvent Level
étant de type String, vous devez la caster en un type numérique comme int
ou long
avant de pouvoir lui appliquer des opérateurs numériques, comme illustré ici : SecurityEvent | where toint(Level) >= 10
Spécifier un intervalle de temps
Vous pouvez spécifier un intervalle de temps en utilisant le sélecteur d’heure ou un filtre temporel.
Utiliser le sélecteur d’heure
Le sélecteur d’heure se trouve près du bouton Exécuter. Il indique que la recherche porte uniquement sur les enregistrements ayant été générés au cours des dernières 24 heures. Cet intervalle de temps par défaut est appliqué à toutes les requêtes. Pour obtenir uniquement les enregistrements générés durant la dernière heure, sélectionnez Dernière heure et réexécutez la requête.
Ajouter un filtre de temps à la requête
Vous pouvez également définir votre propre intervalle de temps en ajoutant un filtre de temps à la requête. L'ajout d'un filtre temporel remplace la plage horaire sélectionnée dans le sélecteur de temps.
Il est préférable de placer le filtre temporel immédiatement après le nom de la table :
SecurityEvent
| where TimeGenerated > ago(30m)
| where toint(Level) >= 10
Dans le filtre temporel précédent, ago(30m)
signifie « il y a 30 minutes ». Cette requête retourne uniquement les enregistrements des 30 dernières minutes, sous la forme 30m, par exemple. Les autres unités de temps incluent les jours (par exemple, 2d) et les secondes (par exemple, 10s).
Utilisez Project et Extend pour sélectionner et calculer des colonnes
Utilisez project
pour sélectionner les colonnes à inclure dans les résultats :
SecurityEvent
| top 10 by TimeGenerated
| project TimeGenerated, Computer, Activity
L’exemple ci-dessus génère le résultat suivant :
Vous pouvez également utiliser project
pour renommer des colonnes et en définir de nouvelles. L’exemple suivant utilise project
pour effectuer les opérations suivantes :
- Sélectionner uniquement les colonnes d’origine
Computer
etTimeGenerated
. - Affichez la colonne
Activity
sous la formeEventDetails
. - Créer une colonne nommée
EventCode
. La fonctionsubstring()
s’utilise pour obtenir uniquement les quatre premiers caractères du champActivity
.
SecurityEvent
| top 10 by TimeGenerated
| project Computer, TimeGenerated, EventDetails=Activity, EventCode=substring(Activity, 0, 4)
Vous pouvez utiliser extend
pour conserver toutes les colonnes d’origine dans le jeu de résultats et en définir d’autres. La requête suivante utilise extend
pour ajouter la colonne EventCode
. Cette colonne peut ne pas s’afficher à la fin des résultats du tableau. Vous devrez alors développer les détails d’un enregistrement pour l’afficher.
SecurityEvent
| top 10 by TimeGenerated
| extend EventCode=substring(Activity, 0, 4)
Utiliser summarize pour agréger des groupes de lignes
Utilisez summarize
pour identifier des groupes d’enregistrements d’après une ou plusieurs colonnes, et leur appliquer des agrégations. L’utilisation la plus courante de summarize
est count
, qui retourne le nombre de résultats contenus dans chaque groupe.
La requête suivante passe en revue tous les enregistrements Perf
générés au cours de la dernière heure, les regroupe par ObjectName
et compte les enregistrements dans chaque groupe :
Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName
Parfois, il est judicieux de définir les groupes au moyen de plusieurs dimensions. Chaque combinaison unique de ces valeurs définit un groupe distinct :
Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName, CounterName
Une autre utilisation courante consiste à effectuer des calculs mathématiques ou statistiques sur chaque groupe. L’exemple qui suit calcule la moyenne de CounterValue
pour chaque ordinateur :
Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer
Malheureusement, les résultats de cette requête n’ont aucun sens, car nous avons combiné différents compteurs de performances. Pour que les résultats de cette requête soient plus explicites, calculez la moyenne séparément pour chaque combinaison de CounterName
et Computer
:
Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer, CounterName
Résumer en fonction d’une colonne d’heure
Le regroupement des résultats peut également reposer sur une colonne temporelle ou une autre valeur continue. Cependant, une simple agrégation by TimeGenerated
créerait des groupes pour chaque milliseconde de l’intervalle de temps, car ces valeurs sont uniques.
Pour créer des groupes sur la base de valeurs continues, vous devez diviser l’intervalle de temps en unités gérables avec bin
. La requête suivante analyse les enregistrements Perf
qui mesurent la mémoire disponible (Available MBytes
) sur un ordinateur spécifique. Elle calcule la valeur moyenne pour chaque période de 1 heure, au cours des 7 derniers jours :
Perf
| where TimeGenerated > ago(7d)
| where Computer == "ContosoAzADDS2"
| where CounterName == "Available MBytes"
| summarize avg(CounterValue) by bin(TimeGenerated, 1h)
Pour rendre la sortie plus lisible, vous pouvez choisir de l’afficher sous la forme d’un graphique chronologique, qui indique la mémoire disponible au fil du temps.
Forum aux questions
Cette section fournit des réponses aux questions fréquentes.
Pourquoi est-ce que je vois des enregistrements en double dans les journaux Azure Monitor ?
Vous pouvez parfois observer des enregistrements en double dans les journaux Azure Monitor. Cette duplication est généralement due à l’une des deux conditions suivantes :
- Les composants du pipeline ont de nouvelles tentatives pour garantir une livraison fiable à la destination. Parfois, cette fonctionnalité peut produire des doublons pour un très petit pourcentage d’éléments de télémétrie.
- Si les enregistrements en double proviennent d’une machine virtuelle, il est possible que l’agent Log Analytics et l’agent Azure Monitor soient tous deux installés. Si vous souhaitez que l’agent Log Analytics soit toujours installé, configurez l’espace de travail Log Analytics pour qu’il ne collecte plus les données qui sont également collectées par la règle de collecte de données utilisée par l’agent Azure Monitor.
Étapes suivantes
- Pour en apprendre davantage sur l’utilisation des données de chaîne dans une requête de journal, consultez Utilisation de chaînes dans des requêtes de journal Azure Monitor.
- Pour en apprendre davantage sur l’agrégation de données dans une requête de journal, consultez Agrégations avancées dans des requêtes de journal Azure Monitor.
- Pour découvrir comment joindre des données provenant de plusieurs tables, consultez Jointures dans les requêtes de journal Azure Monitor.
- Procurez-vous la documentation sur l’intégralité du langage de requête Kusto (KQL) dans Informations de référence sur le langage KQL.