Condividi tramite


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 a 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

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 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

  1. Accedere alla sottoscrizione di Azure tramite l'interfaccia della riga di comando di Azure. Eseguire quindi l'autenticazione nel browser.

    az login
    
  2. Scegliere la sottoscrizione per ospitare l'entità. Questo passaggio è necessario quando si hanno più sottoscrizioni.

    az account set --subscription YOUR_SUBSCRIPTION_GUID
    
  3. Creare l'entità servizio. In questo esempio l'entità servizio è denominata my-service-principal.

    az ad sp create-for-rbac -n "my-service-principal" --role Contributor --scopes /subscriptions/{SubID}
    
  4. Dai dati JSON restituiti copiare appId, passworde tenant per un uso futuro.

    {
      "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"
    }
    

È stata creata l'applicazione Microsoft Entra e l'entità servizio.

Concedere le autorizzazioni dell'app Microsoft Entra

  1. Nell'ambiente di query eseguire il comando di gestione seguente, sostituendo i segnaposto DatabaseName e l'ID applicazione con i valori salvati in precedenza. Questo comando concede all'app il ruolo ingestor del database. Per altre informazioni, vedere Gestire i 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 come note quando si eseguono query sui ruoli associati a un database. Per altre informazioni, vedere Gestire i 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 inserite alle colonne della tabella di destinazione. Nei passaggi seguenti lo schema e il mapping della tabella corrispondono ai dati inviati dall'app di esempio.

  1. Nell'editor di query eseguire il comando di creazione della tabella seguente, sostituendo il segnaposto TableName 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)
    
  2. Eseguire il comando di mapping di inserimento seguente, sostituendo i segnaposto TableName con il nome della tabella di destinazione e TableNameMapping 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

Seguire questa procedura per:

  • Aggiungere il sink Log4j 2 all'app
  • Configurare le variabili usate dal sink
  • Compilare ed eseguire l'app
  1. Aggiungere il codice seguente all'app:

    package com.microsoft.azure.kusto.log4j.sample;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
  2. Configurare il sink Log4j 2 aggiungendo la KustoStrategy voce al file log4j2.xml, sostituendo i segnaposto usando le informazioni nella tabella seguente:

    Il connettore log4J 2 usa una strategia personalizzata usata 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 Nome con distinzione tra maiuscole e minuscole del database di destinazione.
    tableName Nome con distinzione tra maiuscole e minuscole di una tabella di destinazione esistente. Ad esempio, Log4jTest è il nome della tabella creata in Creare una tabella e un mapping di inserimento.
    IDapp ID client dell'applicazione necessario per l'autenticazione. Questo valore è stato salvato in Creare una registrazione dell'app Microsoft Entra.
    appKey Chiave dell'applicazione necessaria per l'autenticazione. Questo valore è stato salvato in Creare una registrazione dell'app Microsoft Entra.
    appTenant ID del tenant in cui è registrata l'applicazione. Questo valore è stato salvato in Creare una registrazione dell'app Microsoft Entra.
    logTableMapping Nome del mapping.
    mappingType Tipo di mapping da utilizzare. Il valore 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.

  3. Inviare 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);
      }
    }
    
  4. Compilare ed eseguire l'app.

  5. Verificare che i dati si trovano 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

  1. Clonare il repository git log4J 2 usando il comando git seguente:

    git clone https://github.com/Azure/azure-kusto-log4j.git
    
  2. 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.

    $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. Nel terminale passare alla cartella samples del repository clonato ed eseguire il comando Maven seguente:

    mvn compile exec:java -Dexec.mainClass="org.example.KustoLog4JSampleApp"
    
  4. Nell'ambiente di query selezionare il database di destinazione ed eseguire la query seguente per esplorare i dati inseriti, sostituendo il segnaposto TableName con il nome della tabella di destinazione:

    <TableName>
    | take 10
    

    L'output dovrebbe essere simile alla tabella seguente:

    Screenshot della tabella con 10 funzioni e risultati.