Collecter des journaux à partir d’un fichier texte ou JSON avec l’agent Azure Monitor

De nombreuses applications consignent des informations dans des fichiers texte ou JSON au lieu des services de journalisation standard tels que le Journal des événements Windows ou Syslog. Cet article explique comment collecter des données de journal à partir de fichiers texte et JSON sur des machines supervisées à l’aide de l’agent Azure Monitor en créant une règle de collecte de données.

Remarque

L’ingestion JSON est en préversion pour l’instant.

Prérequis

Pour effectuer cette procédure, vous devez disposer de ce qui suit :

  • Un espace de travail Log Analytics dans lequel vous avez au moins des droits de contributeur.

  • Un ou deux points de terminaison de collecte de données, selon que votre machine virtuelle et votre espace de travail Log Analytics se trouvent ou non dans la même région.

    Pour plus d’informations, consultez Comment configurer des points de terminaison de collecte de données en fonction de votre déploiement.

  • Autorisations de créer des objets de règle de collecte de données dans l’espace de travail.

  • Le texte JSON doit être contenu sur une seule ligne pour une ingestion appropriée. Le format du corps (fichier) JSON n’est pas pris en charge.

  • Une machine virtuelle, un groupe de machines virtuelles identiques, un serveur Arc sur site ou un agent de surveillance Azure sur un client Windows local qui écrit des journaux dans un fichier texte ou JSON.

    Exigences du fichier texte ou JSON et bonnes pratiques :

    • Stockez des fichiers sur le lecteur local de la machine sur laquelle l’agent Azure Monitor est en cours d’exécution et dans le répertoire surveillé.
    • Délimitez la fin d’un enregistrement avec une fin de ligne.
    • Utilisez l’encodage ASCII ou UTF-8. D’autres formats, tel UTF-16, ne sont pas pris en charge.
    • Créez un fichier journal tous les jours pour pouvoir supprimer facilement les anciens fichiers.
    • Nettoyez tous les fichiers journaux du répertoire surveillé. Le suivi de nombreux fichiers journaux peut entraîner une augmentation de l’utilisation de la mémoire et du processeur de l’agent. Patientez au moins 2 jours afin d’allouer le temps nécessaire au traitement des journaux.
    • Ne remplacez pas un fichier existant par de nouveaux enregistrements. Vous devez ajouter de nouveaux enregistrements uniquement à la fin du fichier. Le remplacement entraîne une perte de données.
    • Ne renommez pas un fichier pour lui donner un autre nom et ouvrir ensuite un nouveau fichier portant le même nom. Cette opération peut entraîner une perte de données.
    • Ne renommez pas ou ne copiez pas de fichiers journaux volumineux qui correspondent au modèle d’analyse de fichier dans le répertoire surveillé. Si vous devez l’effectuer, ne dépassez pas 50 Mo par minute.
    • Ne renommez pas un fichier qui correspond au modèle d’analyse de fichier en utilisant un nouveau nom qui correspond également au modèle d’analyse de fichier. Cette opération entraîne l’ingestion de données en double.

Créer une table personnalisée

La table créée dans le script comporte deux colonnes :

  • TimeGenerated (datetime) [Obligatoire]
  • RawData (chaîne) [Facultatif si le schéma de table est fourni]
  • « FilePath » (chaîne) [Facultatif]
  • YourOptionalColumn (chaîne) [Facultatif]

Le schéma de table par défaut pour les données de journal collectées à partir de fichiers texte est « TimeGenerated » et « RawData ». L’ajout de « FilePath » à l’une ou l’autre équipe est facultatif. Si vous savez que votre schéma final ou votre source est un journal JSON, vous pouvez ajouter les colonnes finales dans le script avant de créer la table. Vous pouvez toujours ajouter des colonnes à l’aide de l’interface utilisateur de table Log Analytics ultérieurement.

Les noms de vos colonnes et les attributs JSON doivent correspondre exactement pour permettre l’analyse automatique dans la table. Les colonnes et les attributs JSON respectent la casse. Par exemple, Rawdata ne collectera pas les données d’événement. Cela doit être RawData. L’ingestion supprime les attributs JSON qui n’ont pas de colonne correspondante.

Le moyen le plus simple d’effectuer l’appel REST consiste à utiliser une ligne de commande Azure Cloud PowerShell (CLI). Pour ouvrir l’interpréteur de commandes, accédez au portail Azure, appuyez sur le bouton Cloud Shell, puis sélectionnez PowerShell. S’il s’agit de votre première utilisation d’Azure Cloud PowerShell, vous devez parcourir l’Assistant Configuration unique.

Copiez et collez ce script dans PowerShell pour créer la table dans votre espace de travail :

$tableParams = @'
{
    "properties": {
        "schema": {
               "name": "{TableName}_CL",
               "columns": [
        {
                                "name": "TimeGenerated",
                                "type": "DateTime"
                        }, 
                       {
                                "name": "RawData",
                                "type": "String"
                       },
                       {
                                "name": "FilePath",
                                "type": "String"
                       },
                      {
                                "name": `"YourOptionalColumn",
                                "type": "String"
                     }
              ]
        }
    }
}
'@

Invoke-AzRestMethod -Path "/subscriptions/{subscription}/resourcegroups/{resourcegroup}/providers/microsoft.operationalinsights/workspaces/{WorkspaceName}/tables/{TableName}_CL?api-version=2021-12-01-preview" -Method PUT -payload $tableParams

Vous devez recevoir une réponse 200, et les détails sur la table que vous venez de créer doivent s’afficher.

Créer une règle de collecte de données pour un fichier texte ou JSON

La règle de collecte de données définit les points suivants :

  • Fichiers journaux sources que l’agent Azure Monitor analyse à la recherche de nouveaux événements.
  • Comment Azure Monitor transforme les événements pendant l’ingestion.
  • Table et espace de travail Log Analytics de destination auxquels Azure Monitor envoie les données.

Vous pouvez définir une règle de collecte de données pour envoyer des données de plusieurs ordinateurs à plusieurs espaces de travail Log Analytics, y compris les espaces de travail dans une autre région ou locataire. Créez la règle de collecte de données dans la même région que celle où se trouve votre espace de travail Log Analytics.

Notes

Pour envoyer des données entre locataires, vous devez d’abord activer Azure Lighthouse.

Pour analyser automatiquement votre fichier journal JSON dans une table personnalisée, suivez les étapes du modèle Resource Manager. Les données texte peuvent être transformées en colonnes en utilisant une transformation au moment de l’ingestion.

Pour créer la règle de collecte de données dans le portail Azure :

  1. Dans le menu Monitor, sélectionnez Règles de collecte des données.

  2. Sélectionnez Créer pour créer une règle de collecte de données et des associations.

    Capture d’écran montrant le bouton Créer sur l’écran Règles de collecte de données.

  3. Entrez un Nom de règle et spécifiez un Abonnement, un Groupe de ressources, une Région, un Type de plateforme et un Point de terminaison de collecte de données :

    • Région spécifie l’emplacement où la règle de collecte de données sera créée. Les machines virtuelles et leurs associations peuvent se trouver dans n’importe quel abonnement ou groupe de ressources dans le locataire.
    • Type de plateforme spécifie le type des ressources auxquelles cette règle peut s’appliquer. L’option Personnalisé permet d’appliquer les types Windows et Linux.
    • Point de terminaison de collecte de données spécifie le point de terminaison de collecte de données auquel l’agent Azure Monitor envoie les données collectées. Ce point de terminaison de collecte de données doit se trouver dans la même région que l’espace de travail Log Analytics. Pour plus d’informations, consultez Comment configurer des points de terminaison de collecte de données en fonction de votre déploiement.

    Capture d’écran montrant l’onglet De base sur l’écran Règle de collecte de données.

  4. Dans l’onglet Ressources :

    1. Sélectionnez + Ajouter des ressources et associez des ressources à la règle de collecte de données. Les ressources peuvent être des machines virtuelles, des groupes de machines virtuelles identiques et Azure Arc pour serveurs. Le portail Azure installe l’agent Azure Monitor sur les ressources sur lesquelles il n’est pas déjà installé.

      Important

      Le portail active une identité managée affectée par le système sur les ressources cibles, en plus des identités affectées par l’utilisateur (le cas échéant). Pour les applications existantes, à moins que vous ne spécifiez l’identité affectée par l’utilisateur dans la demande, la machine utilise par défaut l’identité affectée par le système à la place.

    2. Sélectionnez Activer les points de terminaison de collecte de données.

    3. Vous pouvez éventuellement sélectionner un point de terminaison de collecte de données pour chacune des machines virtuelles associées à la règle de collecte de données. La plupart du temps, vous devez simplement utiliser les valeurs par défaut.

      Ce point de terminaison de collecte de données envoie des fichiers de configuration à la machine virtuelle et doit se trouver dans la même région que celle-ci. Pour plus d’informations, consultez Comment configurer des points de terminaison de collecte de données en fonction de votre déploiement.

    Capture d’écran montrant l’onglet Ressources de l’écran Règle de collecte de données.

  5. Sous l’onglet Collecter et livrer, sélectionnez Ajouter une source de données pour ajouter une source de données et définir une destination.

  6. Dans la liste déroulante Type de source de données, sélectionnez Journaux de texte personnalisés ou Journaux JSON.

  7. Spécifiez les informations suivantes :

    • Modèle de fichier : identifie l’emplacement des fichiers journaux sur le disque local. Vous pouvez entrer plusieurs modèles de fichiers séparés par des virgules (sur Linux, AMA version 1.26 ou ultérieure est nécessaire pour collecter à partir d’une liste de modèles de fichiers séparés par des virgules).

      Exemples de noms valides :

      • 20220122-MyLog.txt
      • ProcessA_MyLog.txt
      • ErrorsOnly_MyLog.txt, WarningOnly_MyLog.txt

      Notes

      Plusieurs fichiers journaux du même type existent généralement dans le même répertoire. Une machine peut par exemple créer un fichier chaque jour pour éviter que le fichier journal ne devienne trop volumineux. Pour collecter des données de journal dans ce scénario, vous pouvez utiliser un caractère générique de fichier. Utilisez le format C:\directoryA\directoryB\*MyLog.txt pour Windows et /var/*.log pour Linux. Les caractères génériques de répertoire ne sont pas pris en charge.

    • Nom de la table : nom de la table de destination que vous avez créée dans votre espace de travail Log Analytics. Pour plus d’informations, consultez Créer une table personnalisée.

    • Délimiteur d’enregistrements : sera utilisé à l’avenir pour autoriser des délimiteurs autres que la fin de ligne actuellement prise en charge (/r/n).

    • Transformation : ajoutez une transformation au moment de l’ingestion ou laissez comme source si vous n’avez pas besoin de transformer les données collectées.

  8. Sous l’onglet Destination, ajoutez une ou plusieurs destinations pour la source de données. Vous pouvez sélectionner plusieurs destinations du même type ou de différents types. Par exemple, vous pouvez sélectionner plusieurs espaces de travail Log Analytics, également appelé hébergement multiple.

    Capture d’écran montrant l’onglet Destination de l’écran Ajouter une source de données pour une règle de collecte de données dans le portail Azure.

  9. Sélectionnez Vérifier + créer pour passer en revue les détails de la règle de collecte des données et l’association avec l’ensemble de machines virtuelles.

  10. Sélectionnez Créer pour créer la règle de collecte de données.

Remarque

Une fois que vous avez créé la règle de collecte des données, jusqu’à dix minutes peuvent être nécessaires avant que les données soient envoyées aux destinations.

Exemples de requêtes de journal

Les noms de colonnes utilisés ici sont donnés à titre d’exemple uniquement. Les noms de colonnes de votre journal seront probablement différents.

  • Comptez le nombre d’événements par code.

    MyApp_CL
    | summarize count() by code
    

Exemple de règle d’alerte

  • Créez une règle d’alerte pour tous les événements d’erreur.

    MyApp_CL
    | where status == "Error"
    | summarize AggregatedValue = count() by Computer, bin(TimeGenerated, 15m)
    

Résoudre les problèmes

Effectuez les étapes suivantes pour résoudre les problèmes liés à la collecte de journaux à partir de fichiers texte et JSON.

Vérifier si vous avez ingéré des données dans votre table personnalisée

Commencez par vérifier si des enregistrements ont été ingérés dans votre table de journaux personnalisée en exécutant la requête suivante dans Log Analytics :

<YourCustomTable>_CL
| where TimeGenerated > ago(48h)
| order by TimeGenerated desc

Si les enregistrements ne sont pas retournés, vérifiez les autres sections à la recherche de causes possibles. Cette requête recherche des entrées pour les deux derniers jours, mais vous pouvez la modifier en spécifiant un autre intervalle de temps. L’affichage des nouvelles données dans votre table peut prendre cinq à sept minutes. L’agent Azure Monitor collecte uniquement les données écrites dans le fichier texte ou JSON après que vous avez associé la règle de collecte de données à la machine virtuelle.

Vérifier que vous avez créé une table personnalisée

Vous devez créer une table de journal personnalisée dans votre espace de travail Log Analytics avant de pouvoir lui envoyer des données.

Vérifier que l’agent envoie correctement des pulsations

Vérifiez que l’agent Azure Monitor communique correctement en exécutant la requête suivante dans Log Analytics pour vérifier s’il existe des enregistrements dans la table Heartbeat.

Heartbeat
| where TimeGenerated > ago(24h)
| where Computer has "<computer name>"
| project TimeGenerated, Category, Version
| order by TimeGenerated desc

Vérifier que vous avez spécifié l’emplacement de journal approprié dans la règle de collecte de données

La règle de collecte de données aura une section similaire à ce qui suit. L’élément filePatterns spécifie le chemin du fichier journal à collecter auprès de l’ordinateur de l’agent. Vérifiez que ceci est correct sur l’ordinateur de l’agent.

"dataSources": [{
            "configuration": {
                "filePatterns": ["C:\\JavaLogs\\*.log"],
                "format": "text",
                "settings": {
                    "text": {
                        "recordStartTimestampFormat": "yyyy-MM-ddTHH:mm:ssK"
                    }
                }
            },
            "id": "myTabularLogDataSource",
            "kind": "logFile",
            "streams": [{
                    "stream": "Custom-TabularData-ABC"
                }
            ],
            "sendToChannels": ["gigl-dce-00000000000000000000000000000000"]
        }
    ]

Ce modèle de fichier doit correspondre aux journaux sur la machine de l’agent.

Capture d’écran des fichiers journaux sur une machine agent.

Utiliser l’utilitaire de résolution des problèmes de l’agent Azure Monitor

Utilisez l’outil de résolution des problèmes Azure Monitor pour rechercher des problèmes courants et partager des résultats avec Microsoft.

Vérifier que les journaux sont remplis

L’agent va collecter seulement le nouveau contenu écrit dans le fichier journal à collecter. Si vous testez les journaux de collecte à partir d’un fichier texte ou JSON, vous pouvez utiliser le script suivant pour générer des exemples de journaux.

# This script writes a new log entry at the specified interval indefinitely.
# Usage:
# .\GenerateCustomLogs.ps1 [interval to sleep]
#
# Press Ctrl+C to terminate script.
#
# Example:
# .\ GenerateCustomLogs.ps1 5

param (
    [Parameter(Mandatory=$true)][int]$sleepSeconds
)

$logFolder = "c:\\JavaLogs"
if (!(Test-Path -Path $logFolder))
{
    mkdir $logFolder
}

$logFileName = "TestLog-$(Get-Date -format yyyyMMddhhmm).log"
do
{
    $count++
    $randomContent = New-Guid
    $logRecord = "$(Get-Date -format s)Z Record number $count with random content $randomContent"
    $logRecord | Out-File "$logFolder\\$logFileName" -Encoding utf8 -Append
    Start-Sleep $sleepSeconds
}
while ($true)

Étapes suivantes

Pour en savoir plus :