Share via


Gegevens opnemen met de Apache log4J 2-connector

Log4J is een populair logboekregistratieframework voor Java-toepassingen die worden onderhouden door de Apache Foundation. Met Log4J kunnen ontwikkelaars bepalen welke logboekinstructies worden uitgevoerd met willekeurige granulariteit op basis van de naam, het logboekniveau en het berichtpatroon van de logboekregistratie. Apache Log4J 2 is een upgrade naar Log4J, met aanzienlijke verbeteringen ten opzichte van de voorgaande Log4j 1.x. Log4J 2 biedt veel van de verbeteringen die beschikbaar zijn in Logback, terwijl enkele inherente problemen in de architectuur van Logback worden opgelost. De Apache log4J 2-sink, ook wel een appender genoemd, streamt uw logboekgegevens naar uw tabel in Kusto, waar u uw logboeken in realtime kunt analyseren en visualiseren.

Zie Overzicht van gegevensintegraties voor een volledige lijst met gegevensconnectors.

Vereisten

Uw omgeving instellen

In deze sectie bereidt u uw omgeving voor op het gebruik van de Log4J 2-sink.

Het pakket installeren

Als u de sink in een toepassing wilt gebruiken, voegt u de volgende afhankelijkheden toe aan uw pom.xml Maven-bestand. De sink verwacht dat de log4j-core wordt opgegeven als een afhankelijkheid in de toepassing.

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

Een Microsoft Entra-app-registratie maken

  1. Meld u aan bij uw Azure-abonnement via Azure CLI. Verifieer vervolgens in de browser.

    az login
    
  2. Kies het abonnement om de principal te hosten. Deze stap is nodig wanneer u meerdere abonnementen hebt.

    az account set --subscription YOUR_SUBSCRIPTION_GUID
    
  3. Maak de service-principal. In dit voorbeeld wordt de service-principal genoemd my-service-principal.

    az ad sp create-for-rbac -n "my-service-principal" --role Contributor --scopes /subscriptions/{SubID}
    
  4. Kopieer vanuit de geretourneerde JSON-gegevens de appId, password, en tenant voor toekomstig gebruik.

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

U hebt uw Microsoft Entra toepassing en service-principal gemaakt.

De Microsoft Entra-app machtigingen verlenen

  1. Voer in uw queryomgeving de volgende beheeropdracht uit, waarbij u de tijdelijke aanduidingen DatabaseName en toepassings-id vervangt door de eerder opgeslagen waarden. Met deze opdracht verleent de app de rol database ingestor . Zie Databasebeveiligingsrollen beheren voor meer informatie.

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

    Notitie

    De laatste parameter is een tekenreeks die als notities wordt weergegeven wanneer u een query uitvoert op de rollen die zijn gekoppeld aan een database. Zie Databaserollen beheren voor meer informatie.

Een tabel- en opnametoewijzing maken

Maak een doeltabel voor de binnenkomende gegevens en wijs de kolommen met opgenomen gegevens toe aan de kolommen in de doeltabel. In de volgende stappen komen het tabelschema en de toewijzing overeen met de gegevens die vanuit de voorbeeld-app worden verzonden.

  1. Voer in de queryeditor de volgende opdracht voor het maken van tabellen uit, waarbij u de tijdelijke aanduiding TableName vervangt door de naam van de doeltabel:

    .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. Voer de volgende opdracht voor opnametoewijzing uit, waarbij u de tijdelijke aanduidingen TableName vervangt door de naam van de doeltabel en TableNameMapping door de naam van de opnametoewijzing:

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

De Log4j 2-sink toevoegen aan uw app

Gebruik de volgende stappen om:

  • De Log4j 2-sink toevoegen aan uw app
  • De variabelen configureren die door de sink worden gebruikt
  • De app bouwen en uitvoeren
  1. Voeg de volgende code toe aan uw app:

    package com.microsoft.azure.kusto.log4j.sample;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
  2. Configureer de Log4j 2-sink door de KustoStrategy vermelding toe te voegen aan het log4j2.xml-bestand, waarbij tijdelijke aanduidingen worden vervangen met behulp van de informatie in de volgende tabel:

    De log4J 2-connector maakt gebruik van een aangepaste strategie die wordt gebruikt in de RollingFileAppender. Logboeken worden in het rolling-bestand geschreven om gegevensverlies te voorkomen als gevolg van een netwerkfout tijdens het maken van verbinding met het Kusto-cluster. De gegevens worden opgeslagen in een rolling-bestand en vervolgens naar het Kusto-cluster verwijderd.

    <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"
    />
    
    Eigenschap Beschrijving
    clusterIngestUrl De opname-URI voor uw cluster in de indeling https://ingest-<cluster>.<region.kusto.windows.net>.
    dbName De hoofdlettergevoelige naam van de doeldatabase.
    tableName De hoofdlettergevoelige naam van een bestaande doeltabel. Log4jTest is bijvoorbeeld de naam van de tabel die is gemaakt in Een tabel en opnametoewijzing maken.
    appId De client-id van de toepassing die is vereist voor verificatie. U hebt deze waarde opgeslagen in Een Microsoft Entra-app-registratie maken.
    appKey De toepassingssleutel die is vereist voor verificatie. U hebt deze waarde opgeslagen in Een Microsoft Entra-app-registratie maken.
    appTenant De id van de tenant waarin de toepassing is geregistreerd. U hebt deze waarde opgeslagen in Een Microsoft Entra-app-registratie maken.
    logTableMapping De naam van de toewijzing.
    mappingType Het type toewijzing dat moet worden gebruikt. De standaardwaarde is csv.
    flushImmediately Als deze optie is ingesteld op true, wordt de buffer na elke logboek gebeurtenis door de sink leeggemaakt. De standaardwaarde is false.

    Zie Sinkopties voor meer opties.

  3. Gegevens verzenden naar Kusto met behulp van de Log4j 2-sink. Bijvoorbeeld:

    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. Bouw de app en voer deze uit.

  5. Controleer of de gegevens zich in uw cluster bevinden. Voer in uw queryomgeving de volgende query uit en vervang de tijdelijke aanduiding door de naam van de tabel die eerder is gebruikt:

    <TableName>
    | take 10
    

De voorbeeld-app uitvoeren

  1. Kloon de git-opslagplaats log4J 2 met behulp van de volgende git-opdracht:

    git clone https://github.com/Azure/azure-kusto-log4j.git
    
  2. Stel de volgende omgevingsvariabelen in om de Log4J 2-sink te configureren:

    Notitie

    In het voorbeeldproject dat is opgenomen in de Git-opslagplaats, wordt de standaardconfiguratie-indeling gedefinieerd in het bestand log4j2.xml. Dit configuratiebestand bevindt zich onder het bestandspad: \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. Navigeer in uw terminal naar de map voorbeelden van de gekloonde opslagplaats en voer de volgende Maven-opdracht uit:

    mvn compile exec:java -Dexec.mainClass="org.example.KustoLog4JSampleApp"
    
  4. Selecteer in uw queryomgeving de doeldatabase en voer de volgende query uit om de opgenomen gegevens te verkennen, waarbij u de tijdelijke aanduiding TableName vervangt door de naam van de doeltabel:

    <TableName>
    | take 10
    

    De uitvoer moet er ongeveer uitzien als in de volgende tabel:

    Schermopname van tabel met de functie take 10 en resultaten.