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.

  • Le canal suivant est l’opérateurtake.

    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’opérateur take pour afficher un petit échantillon d’enregistrements en retournant jusqu’au nombre spécifié d’enregistrements. Les résultats sélectionnés sont arbitraires et affichés dans un ordre particulier. Si vous devez retourner des résultats dans un ordre particulier, utilisez les opérateurs et top les sort 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 sort opérateurs et top leurs desc arguments.asc Bien qu’il take soit utile d’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 asc

Desc

Utilisez l’argument desc pour trier les enregistrements dans l’ordre décroissant. Décroissant est l’ordre de tri par défaut pour sort et top, vous pouvez donc généralement omettre l’argument desc .

Par exemple, les données retournées par les deux requêtes suivantes sont triées par la colonne TimeGenerated, dans l’ordre décroissant :

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

Asc

Pour trier dans l’ordre croissant, spécifiez asc.

Sort

Vous pouvez utiliser l’opérateursort. sort trie les résultats de la requête par la colonne que vous spécifiez. Toutefois, sort ne limite pas le nombre d’enregistrements retournés par la requête.

Par exemple, la requête suivante retourne tous les enregistrements disponibles pour la SecurityEvent table, qui est jusqu’à un maximum de 30 000 enregistrements et les trie par la colonne TimeGenerated.

SecurityEvent	
| sort by TimeGenerated

La requête précédente peut retourner trop de résultats. En outre, il peut également prendre un certain temps pour retourner les résultats. 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 derniers enregistrements consiste à utiliser l’opérateurtop.

TOP

Utilisez l’opérateur top pour trier la table entière côté serveur, puis renvoyer uniquement les enregistrements principaux.

Par exemple, la requête suivante retourne les 10 derniers enregistrements :

SecurityEvent
| top 10 by TimeGenerated

Le résultat ressemble à cet exemple.

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

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’opérateur where suivi d’une ou plusieurs conditions. Par exemple, la requête suivante retourne uniquement les enregistrements SecurityEventLevel 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.

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

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 de temps remplace l’intervalle de temps sélectionné 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 :

Screenshot that shows the query 'project' results list.

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 et TimeGenerated.
  • Affichez la colonne Activity sous la forme EventDetails.
  • Créer une colonne nommée EventCode. La fonction substring() s’utilise pour obtenir uniquement les quatre premiers caractères du champ Activity.
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.

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

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