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
- Apache Maven
- Un cluster et une base de données Azure Data Explorer ouune base de données KQL dans Microsoft Fabric
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
Connectez-vous à votre abonnement Azure via Azure CLI. Authentifiez-vous ensuite dans le navigateur.
az login
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
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}
À partir des données JSON retournées, copiez le
appId
,password
ettenant
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
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.
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)
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
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;
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.
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); } }
Générez et exécutez l'application.
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
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
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.
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"
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 :
Contenu connexe
- Vue d’ensemble des connecteurs de données
- Vue d’ensemble du Langage de requête Kusto (KQL)
- Commencer avec Azure Databricks Log4J vers le référentiel Git Azure Data Explorer
- Ingérer des journaux Azure Databricks dans Azure Data Explorer à l’aide du blog Log4j2 - Communauté du connecteur Azure Data Explorer