Inserire dati con il connettore Apache log4J 2
Log4J è un framework di registrazione diffuso per le applicazioni Java gestite da Apache Foundation. Log4J consente agli sviluppatori di controllare quali istruzioni di log vengono restituite con granularità arbitraria in base al nome, al livello del logger e al modello di messaggio. Apache Log4J 2 è un aggiornamento di Log4J, con miglioramenti significativi rispetto al Log4j 1.x. precedente. Log4J 2 offre molti dei miglioramenti disponibili in Logback, risolvendo alcuni problemi intrinseci nell'architettura di Logback. Il sink Apache log4J 2, noto anche come appender, trasmette i dati di log alla tabella in Kusto, in cui è possibile analizzare e visualizzare i log in tempo reale.
Per un elenco completo dei connettori dati, vedere Panoramica delle integrazioni dei dati.
Prerequisiti
- Apache Maven
- Un cluster e un database Esplora dati di Azure o un database KQL in Microsoft Fabric
Configurazione dell'ambiente
In questa sezione si prepara l'ambiente per l'uso del sink Log4J 2.
Installare il pacchetto
Per usare il sink in un’applicazione, aggiungere le dipendenze seguenti al file pom.xml di Maven. Il sink prevede che log4j-core venga fornito come dipendenza nell'applicazione.
<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>
Creare una registrazione dell'app Microsoft Entra
Accedere alla sottoscrizione di Azure usando l'interfaccia della riga di comando di Azure. Eseguire quindi l'autenticazione nel browser.
az login
Scegliere la sottoscrizione per ospitare l'entità di sicurezza. Questo passaggio è necessario quando si hanno più sottoscrizioni.
az account set --subscription YOUR_SUBSCRIPTION_GUID
Creare l'entità servizio. In questo esempio l'entità servizio viene chiamata
my-service-principal
.az ad sp create-for-rbac -n "my-service-principal" --role Contributor --scopes /subscriptions/{SubID}
Dai dati JSON restituiti copiare
appId
,password
etenant
per un uso futuro.{ "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" }
L'applicazione Microsoft Entra e l'entità servizio sono state create.
Concedere autorizzazioni all'applicazione Microsoft Entra
Nell'ambiente di query eseguire il comando di gestione seguente, sostituendo i segnaposto DatabaseName e ID applicazione con i valori salvati in precedenza. Questo comando concede all'app il ruolo ingestor del database. Per altre informazioni, vedere Gestisci ruoli di sicurezza del database.
.add database DatabaseName ingestors ('aadappID=12345-abcd-12a3-b123-ccdd12345a1b') 'App Registration'
Nota
L'ultimo parametro è una stringa che viene visualizzata in forma di note quando si eseguono query sui ruoli associati a un database. Per altre informazioni, vedere Gestisci ruoli del database.
Creare una tabella e un mapping di inserimento
Creare una tabella di destinazione per i dati in ingresso, mappando le colonne di dati inseriti alle colonne della tabella di destinazione. Nei seguenti passaggi lo schema e il mapping della tabella corrispondono ai dati inviati dall'app di esempio.
Nell'editor di query eseguire il comando di creazione della tabella seguente, sostituendo il segnaposto NomeTabella con il nome della tabella di destinazione:
.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)
Eseguire il comando di mapping di inserimento seguente, sostituendo i segnaposto NomeTabella con il nome della tabella di destinazione e NomeMappingTabella con il nome del mapping di inserimento:
.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}]'
Aggiungere il sink Log4j 2 all'app
Eseguire la procedura descritta di seguito per:
- Aggiungere il sink Log4j 2 all'app
- Configurare le variabili usate dal sink
- Compilare ed eseguire l'app
Aggiungere il seguente codice all'applicazione:
package com.microsoft.azure.kusto.log4j.sample; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;
Configurare il sink Log4j 2 aggiungendo la voce
KustoStrategy
al file log4j2.xml, sostituendo i segnaposto usando le informazioni presenti nella tabella seguente:Il connettore log4J 2 usa una strategia personalizzata presente in RollingFileAppender. I log vengono scritti nel file in sequenza per evitare perdite di dati derivanti da errori di rete durante la connessione al cluster Kusto. I dati vengono archiviati in un file in sequenza e quindi scaricati nel 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" />
Proprietà Descrizione clusterIngestUrl URI di inserimento per il cluster nel formato https://ingest-<cluster>.<region>.kusto.windows.net. dbname Il nome che è sensibile alle maiuscole del database di destinazione. tableName Nome sensibile alle maiuscole della tabella di destinazione esistente. Ad esempio, Log4jTest è il nome della tabella creata in Creare una tabella e un mapping di inserimento. appId L'ID client dell'applicazione richiesto per l'autenticazione. Questo valore è stato salvato in Creare una registrazione App di Microsoft Entra. appKey La chiave dell'applicazione necessaria per l'autenticazione. Questo valore è stato salvato in Creare una registrazione App di Microsoft Entra. appTenant L'ID del tenant dove è registrata l'applicazione. Questo valore è stato salvato in Creare una registrazione App di Microsoft Entra. logTableMapping Nome del mapping. mappingType Il tipo di mapping da usare. Il predefinito è csv. flushImmediately Se impostato su true, il sink scarica il buffer dopo ogni evento del log. L'impostazione predefinita è false. Per altre opzioni, vedere Opzioni sink.
Inviare i dati a Kusto usando il sink Log4j 2. Ad esempio:
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); } }
Compilare ed eseguire l'app.
Verificare che i dati si trovino nel cluster. Nell'ambiente di query eseguire la query seguente sostituendo il segnaposto con il nome della tabella usata in precedenza:
<TableName> | take 10
Eseguire l'app di esempio
Clonare il repository git log4J 2 usando il comando git seguente:
git clone https://github.com/Azure/azure-kusto-log4j.git
Impostare le variabili di ambiente seguenti per configurare il sink Log4J 2:
Nota
Nel progetto di esempio incluso nel repository git il formato di configurazione predefinito è definito nel file log4j2.xml. Questo file di configurazione si trova nel percorso del file: \azure-kusto-log4j\samples\src\main\resources\log4j2.xml.
Nel terminale passare alla cartella samples del repository clonato ed eseguire il comando Maven seguente:
mvn compile exec:java -Dexec.mainClass="org.example.KustoLog4JSampleApp"
Nell'ambiente di query selezionare il database di destinazione ed eseguire la query seguente per esplorare i dati inseriti, sostituendo il segnaposto NomeTabella con il nome della tabella di destinazione:
<TableName> | take 10
L'output dovrebbe essere simile alla tabella seguente: