Partager via


Ingérer des données avec le connecteur Apache log4J 2

Log4J est une infrastructure de journalisation populaire pour les applications Java gérées par Apache Foundation. Log4J permet aux développeurs de contrôler les instructions de journal qui sont générées avec une granularité arbitraire en fonction du nom, du niveau d’enregistreur d’événements et du modèle de message de l’enregistreur d’événements. Apache Log4J 2 est une mise à niveau vers Log4J, avec des améliorations significatives par rapport à log4j 1.x précédent. Log4J 2 fournit de nombreuses améliorations disponibles dans Logback, tout en corrigeant certains problèmes inhérents à l’architecture de Logback. Le récepteur Apache log4J 2, également appelé appender, transmet vos données de journal à votre table kusto, où vous pouvez analyser et visualiser vos journaux en temps réel.

Pour obtenir la liste complète des connecteurs de données, consultez Vue d’ensemble des intégrations de données.

Prérequis

Configurer votre environnement

Dans cette section, vous préparez votre environnement à utiliser le récepteur Log4J 2.

Installer le package

Pour utiliser le récepteur dans une application, ajoutez les dépendances suivantes à votre fichier Mavenpom.xml . Le récepteur s’attend à ce que log4j-core soit fourni en tant que dépendance dans l’application.

<dependency>
    <groupId>com.microsoft.azure.kusto</groupId>
    <artifactId>azure-kusto-log4j</artifactId>
    <version>1.0.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>${log4j.version}</version>
</dependency>

Créer une inscription d’application Microsoft Entra

  1. Connectez-vous à votre abonnement Azure via Azure CLI. Authentifiez-vous ensuite dans le navigateur.

    az login
    
  2. Choisissez l’abonnement pour héberger le principal. Cette étape est nécessaire quand vous avez plusieurs abonnements.

    az account set --subscription YOUR_SUBSCRIPTION_GUID
    
  3. Créez le principal de service. Dans cet exemple, le principal de service est appelé my-service-principal.

    az ad sp create-for-rbac -n "my-service-principal" --role Contributor --scopes /subscriptions/{SubID}
    
  4. À partir des données JSON retournées, copiez le appId, passwordet tenant pour une utilisation ultérieure.

    {
      "appId": "1234abcd-e5f6-g7h8-i9j0-1234kl5678mn",
      "displayName": "my-service-principal",
      "name": "my-service-principal",
      "password": "1234abcd-e5f6-g7h8-i9j0-1234kl5678mn",
      "tenant": "1234abcd-e5f6-g7h8-i9j0-1234kl5678mn"
    }
    

Vous avez créé votre application Microsoft Entra et votre principal de service.

Accorder les autorisations d’application Microsoft Entra

  1. Dans votre environnement de requête, exécutez la commande de gestion suivante, en remplaçant les espaces réservés DatabaseName et l’ID d’application par les valeurs précédemment enregistrées. Cette commande accorde à l’application le rôle d’ingestionneur de base de données . Pour plus d’informations, consultez Gérer les rôles de sécurité de base de données.

    .add database DatabaseName ingestors ('aadappID=12345-abcd-12a3-b123-ccdd12345a1b') 'App Registration'
    

    Notes

    Le dernier paramètre est une chaîne qui s’affiche sous la forme de notes lorsque vous interrogez les rôles associés à une base de données. Pour plus d’informations, consultez Gérer les rôles de base de données.

Créer un mappage de table et d’ingestion

Créez une table cible pour les données entrantes, en mappant les colonnes de données ingérées aux colonnes de la table cible. Dans les étapes suivantes, le schéma de table et le mappage correspondent aux données envoyées à partir de l’exemple d’application.

  1. Dans votre éditeur de requête, exécutez la commande de création de table suivante, en remplaçant l’espace réservé TableName par le nom de la table cible :

    .create table log4jTest (timenanos:long,timemillis:long,level:string,threadid:string,threadname:string,threadpriority:int,formattedmessage:string,loggerfqcn:string,loggername:string,marker:string,thrownproxy:string,source:string,contextmap:string,contextstack:string)
    
  2. Exécutez la commande de mappage d’ingestion suivante, en remplaçant les espaces réservés TableName par le nom de la table cible et TableNameMapping par le nom du mappage d’ingestion :

    .create table log4jTest ingestion csv mapping 'log4jCsvTestMapping' '[{"Name":"timenanos","DataType":"","Ordinal":"0","ConstValue":null},{"Name":"timemillis","DataType":"","Ordinal":"1","ConstValue":null},{"Name":"level","DataType":"","Ordinal":"2","ConstValue":null},{"Name":"threadid","DataType":"","Ordinal":"3","ConstValue":null},{"Name":"threadname","DataType":"","Ordinal":"4","ConstValue":null},{"Name":"threadpriority","DataType":"","Ordinal":"5","ConstValue":null},{"Name":"formattedmessage","DataType":"","Ordinal":"6","ConstValue":null},{"Name":"loggerfqcn","DataType":"","Ordinal":"7","ConstValue":null},{"Name":"loggername","DataType":"","Ordinal":"8","ConstValue":null},{"Name":"marker","DataType":"","Ordinal":"9","ConstValue":null},{"Name":"thrownproxy","DataType":"","Ordinal":"10","ConstValue":null},{"Name":"source","DataType":"","Ordinal":"11","ConstValue":null},{"Name":"contextmap","DataType":"","Ordinal":"12","ConstValue":null},{"Name":"contextstack","DataType":"","Ordinal":"13","ConstValue":null}]'
    

Ajouter le récepteur Log4j 2 à votre application

Procédez comme suit pour :

  • Ajouter le récepteur Log4j 2 à votre application
  • Configurer les variables utilisées par le récepteur
  • Générer et exécuter l’application
  1. Ajoutez le code suivant à votre application :

    package com.microsoft.azure.kusto.log4j.sample;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
  2. Configurez le récepteur Log4j 2 en ajoutant l’entrée KustoStrategy au fichier log4j2.xml, en remplaçant les espaces réservés à l’aide des informations de la table qui suit :

    Le connecteur log4J 2 utilise une stratégie personnalisée utilisée dans RollingFileAppender. Les journaux sont écrits dans le fichier propagé pour éviter toute perte de données résultant d’une défaillance réseau lors de la connexion au cluster Kusto. Les données sont stockées dans un fichier propagé, puis vidées dans le cluster Kusto.

    <KustoStrategy
      clusterIngestUrl = "${env:LOG4J2_ADX_INGEST_CLUSTER_URL}"
      appId = "${env:LOG4J2_ADX_APP_ID}"
      appKey = "${env:LOG4J2_ADX_APP_KEY}"
      appTenant = "${env:LOG4J2_ADX_TENANT_ID}"
      dbName = "${env:LOG4J2_ADX_DB_NAME}"
      tableName = "<MyTable>"
      logTableMapping = "<MyTableCsvMapping>"
      mappingType = "csv"
      flushImmediately = "false"
    />
    
    Propriété Description
    clusterIngestUrl URI d’ingestion pour votre cluster au format https://ingest-<cluster>.<region.kusto.windows.net>.
    Dbname Nom de la base de données cible, respectant la casse.
    tableName Nom respectant la casse d’une table cible existante. Par exemple, Log4jTest est le nom de la table créée dans Créer une table et mappage d’ingestion.
    appId ID client d’application requis pour l’authentification. Vous avez enregistré cette valeur dans Créer une inscription d’application Microsoft Entra.
    appKey Clé d’application requise pour l’authentification. Vous avez enregistré cette valeur dans Créer une inscription d’application Microsoft Entra.
    appTenant ID du locataire dans lequel l’application est inscrite. Vous avez enregistré cette valeur dans Créer une inscription d’application Microsoft Entra.
    logTableMapping Nom du mappage.
    mappingType Type de mappage à utiliser. La valeur par défaut est csv.
    vider immédiatement Si la valeur est true, le récepteur vide la mémoire tampon après chaque événement de journal. La valeur par défaut est false.

    Pour plus d’options, consultez Options du récepteur.

  3. Envoyez des données à Kusto à l’aide du récepteur Log4j 2. Par exemple :

    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    
    public class MyClass {
      private static final Logger logger = LogManager.getLogger(KustoLog4JSampleApp.class);
      public static void main(String[] args) {
        Runnable loggingTask = () -> {
          logger.trace(".....read_physical_netif: Home list entries returned = 7");
          logger.debug(".....api_reader: api request SENDER");
          logger.info(".....read_physical_netif: index #0, interface VLINK1 has address 129.1.1.1, ifidx 0");
          logger.warn(".....mailslot_create: setsockopt(MCAST_ADD) failed - EDC8116I Address not available.");
          logger.error(".....error_policyAPI: APIInitializeError:  ApiHandleErrorCode = 98BDFB0,  errconnfd = 22");
          logger.fatal(".....fatal_error_timerAPI: APIShutdownError:  ReadBuffer = 98BDFB0,  RSVPGetTSpec = error");
        };
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
        executor.scheduleAtFixedRate(loggingTask, 0, 3, TimeUnit.SECONDS);
      }
    }
    
  4. Générez et exécutez l'application.

  5. Vérifiez que les données se situent dans votre cluster. Dans votre environnement de requête, exécutez la requête suivante en remplaçant l’espace réservé par le nom de la table utilisée précédemment :

    <TableName>
    | take 10
    

Exécution de l'exemple d'application

  1. Clonez le dépôt git log4J 2 à l’aide de la commande git suivante :

    git clone https://github.com/Azure/azure-kusto-log4j.git
    
  2. Définissez les variables d’environnement suivantes pour configurer le récepteur Log4J 2 :

    Notes

    Dans l’exemple de projet inclus dans le dépôt Git, le format de configuration par défaut est défini dans le fichier log4j2.xml. Ce fichier de configuration se trouve sous le chemin du fichier : \azure-kusto-log4j\samples\src\main\resources\log4j2.xml.

    $env:LOG4J2_ADX_DB_NAME="<db-name>"
    $env:LOG4J2_ADX_TENANT_ID="<tenant-id>"
    $env:LOG4J2_ADX_INGEST_CLUSTER_URL="https://ingest-<cluster>.kusto.windows.net"
    $env:LOG4J2_ADX_APP_ID="<app-id>"
    $env:LOG4J2_ADX_APP_KEY="<app-key>"
    
  3. Dans votre terminal, accédez au dossier d’exemples du dépôt cloné et exécutez la commande Maven suivante :

    mvn compile exec:java -Dexec.mainClass="org.example.KustoLog4JSampleApp"
    
  4. Dans votre environnement de requête, sélectionnez la base de données cible et exécutez la requête suivante pour explorer les données ingérées, en remplaçant l’espace réservé TableName par le nom de la table cible :

    <TableName>
    | take 10
    

    Votre sortie doit ressembler au tableau suivant :

    Capture d’écran de la table avec la fonction take 10 et les résultats.