Partager via


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

Log4J est un framework 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. Apache Log4J 2 est une mise à niveau vers Log4J, avec des améliorations significatives apportées à la version précédente Log4j 1.x. Log4J 2 fournit de nombreuses améliorations disponibles dans Logback, tout en corrigeant certains problèmes inhérents dans l’architecture de Logback. Le récepteur Apache log4J 2, également appelé appender, diffuse en continu vos données de journal dans votre table dans Kusto, où vous pouvez analyser et visualiser vos journaux en temps réel.

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

Prérequis

Paramétrer votre environnement

Dans cette section, vous apprêtez votre environnement pour utiliser le récepteur Log4J 2.

Installer le package

pour utiliser le récepteur dans l’application, ajoutez les dépendances suivantes à votre fichier Maven pom.xml. Le récepteur s’attend à ce que le log4j-core soit fourni comme 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éez 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, password et tenant pour une utilisation ultérieure.

    {
      "appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
      "displayName": "my-service-principal",
      "name": "my-service-principal",
      "password": "00001111-aaaa-2222-bbbb-3333cccc4444",
      "tenant": "00001111-aaaa-2222-bbbb-3333cccc4444"
    }
    

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

Accordez 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’ingestion de base de données. Pour en savoir plus, consultez Gérer les rôles de sécurité de bases de données.

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

    Remarque

    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 en savoir plus, consultez Rôles de sécurité de bases de données.

Créez une table et un mappage 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. Le schéma de table et le mappage correspondent aux données envoyées à partir de l’exemple d’application dans les étapes suivantes.

  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}]'
    

Ajoutez le récepteur Log4j 2 à votre application

Procédez comme suit pour :

  • Ajoutez le récepteur Log4j 2 à votre application
  • Configurez 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 contenues dans 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 durant la connexion au cluster Kusto. Les données sont stockées dans un fichier propagé, puis vidées sur 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 L’URI d’ingestion de votre cluster au format https://ingest-<cluster>.<region>.kusto.windows.net.
    dbName Nom de la base de données cible, respectant la casse.
    tableName Le nom respectant la casse d’une table cible existante. Par exemple, Log4jTest renvoie au nom de la table créée dans Créer une table et le mappage d’ingestion.
    ID_application ID client de l’application requis pour l’authentification. Vous avez enregistré cette valeur dans Créer une inscription d’application Microsoft Entra.
    appkey La clé d’application requise pour l’authentification. Vous avez enregistré cette valeur dans Créer une inscription d’application Microsoft Entra.
    appTenant L’identificateur du locataire où l’application est inscrite. Vous avez enregistré cette valeur dans Créer une inscription d’application Microsoft Entra.
    logTableMapping Le nom du mappage.
    mappingType Le type de mappage à utiliser. La valeur par défaut est csv.
    flushImmediately 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. Rassurez-vous 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 référentiel 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 environnementales suivantes pour configurer le récepteur Log4J 2 :

    Remarque

    Dans l’exemple de projet inclus dans le référentiel 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 d’accès 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. Accédez au dossier d’exemples du référentiel cloné dans votre terminal 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 résultat doit être semblable à la table ci-dessous :

    Capture d’écran de la table avec 10 fonctions et résultats.