Pozyskiwanie danych za pomocą łącznika apache log4J 2

Log4J to popularna platforma rejestrowania dla aplikacji Java obsługiwanych przez platformę Apache Foundation. Usługa Log4J umożliwia deweloperom kontrolowanie, które instrukcje dziennika są danymi wyjściowymi z dowolnym poziomem szczegółowości na podstawie nazwy rejestratora, poziomu rejestratora i wzorca komunikatów. Apache Log4J 2 to uaktualnienie do usługi Log4J z znaczącymi ulepszeniami w porównaniu z poprzednimi wersjami log4j 1.x. Usługa Log4J 2 udostępnia wiele ulepszeń dostępnych w usłudze Logback, jednocześnie naprawiając pewne problemy związane z architekturą usługi Logback. Ujście apache log4J 2, znane również jako dodatek, przesyła strumieniowo dane dziennika do tabeli w usłudze Kusto, gdzie można analizować i wizualizować dzienniki w czasie rzeczywistym.

Aby uzyskać pełną listę łączników danych, zobacz Omówienie integracji danych.

Wymagania wstępne

Konfigurowanie środowiska

W tej sekcji przygotujesz środowisko do korzystania z ujścia usługi Log4J 2.

Instalowanie pakietu

Aby użyć ujścia w aplikacji, dodaj następujące zależności do pliku pom.xml Maven. Ujście oczekuje, że rdzeń log4j jest udostępniany jako zależność w aplikacji.

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

Tworzenie rejestracji aplikacji Entra firmy Microsoft

  1. Zaloguj się do subskrypcji platformy Azure za pomocą interfejsu wiersza polecenia platformy Azure. Następnie uwierzytelnij się w przeglądarce.

    az login
    
  2. Wybierz subskrypcję do hostowania podmiotu zabezpieczeń. Ten krok jest wymagany, gdy masz wiele subskrypcji.

    az account set --subscription YOUR_SUBSCRIPTION_GUID
    
  3. Utwórz jednostkę usługi. W tym przykładzie jednostka usługi nosi nazwę my-service-principal.

    az ad sp create-for-rbac -n "my-service-principal" --role Contributor --scopes /subscriptions/{SubID}
    
  4. Z zwróconych danych JSON skopiuj wartości appId, passwordi tenant do użycia w przyszłości.

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

Utworzono aplikację Microsoft Entra i jednostkę usługi.

Udzielanie uprawnień aplikacji Microsoft Entra

  1. W środowisku zapytań uruchom następujące polecenie zarządzania, zastępując symbole zastępcze DatabaseName i identyfikator aplikacji wcześniej zapisanymi wartościami. To polecenie przyznaje aplikacji rolę ingestor bazy danych. Aby uzyskać więcej informacji, zobacz Zarządzanie rolami zabezpieczeń bazy danych.

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

    Uwaga

    Ostatni parametr to ciąg, który jest wyświetlany jako notatki podczas wykonywania zapytań dotyczących ról skojarzonych z bazą danych. Aby uzyskać więcej informacji, zobacz Zarządzanie rolami bazy danych.

Tworzenie tabeli i mapowania pozyskiwania

Utwórz tabelę docelową dla danych przychodzących, mapując pozyskane kolumny danych na kolumny w tabeli docelowej. W poniższych krokach schemat tabeli i mapowanie odpowiadają danym wysyłanym z przykładowej aplikacji.

  1. W edytorze zapytań uruchom następujące polecenie tworzenia tabeli, zastępując symbol zastępczy TableName nazwą tabeli docelowej:

    .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. Uruchom następujące polecenie mapowania pozyskiwania, zastępując symbole zastępcze TableName nazwą tabeli docelowej i tabelą TableNameMapping nazwą mapowania pozyskiwania:

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

Dodawanie ujścia log4j 2 do aplikacji

Wykonaj następujące czynności, aby:

  • Dodawanie ujścia log4j 2 do aplikacji
  • Konfigurowanie zmiennych używanych przez ujście
  • Skompiluj i uruchom aplikację
  1. Dodaj następujący kod do aplikacji:

    package com.microsoft.azure.kusto.log4j.sample;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
  2. Skonfiguruj ujście log4j 2, dodając KustoStrategy wpis do pliku log4j2.xml, zastępując symbole zastępcze przy użyciu informacji w poniższej tabeli:

    Łącznik log4J 2 używa niestandardowej strategii używanej w pliku RollingFileAppender. Dzienniki są zapisywane w pliku kroczącym, aby zapobiec utracie danych wynikających z awarii sieci podczas nawiązywania połączenia z klastrem Kusto. Dane są przechowywane w pliku kroczącym, a następnie opróżniane do klastra 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"
    />
    
    Właściwości opis
    clusterIngestUrl Identyfikator URI pozyskiwania dla klastra w klastrze> formatuhttps://ingest-<.<region.kusto.windows.net>.
    dbName W nazwie docelowej bazy danych uwzględniana jest wielkość liter.
    tableName W nazwie istniejącej tabeli docelowej jest uwzględniana wielkość liter. Na przykład Log4jTest to nazwa tabeli utworzonej w sekcji Tworzenie tabeli i mapowania pozyskiwania.
    appId Identyfikator klienta aplikacji wymagany do uwierzytelniania. Zapisano tę wartość w sekcji Tworzenie rejestracji aplikacji Entra Firmy Microsoft.
    appKey Klucz aplikacji wymagany do uwierzytelniania. Zapisano tę wartość w sekcji Tworzenie rejestracji aplikacji Entra Firmy Microsoft.
    appTenant Identyfikator dzierżawy, w której zarejestrowano aplikację. Zapisano tę wartość w sekcji Tworzenie rejestracji aplikacji Entra Firmy Microsoft.
    logTableMapping Nazwa mapowania.
    mappingType Typ mapowania do użycia. Wartość domyślna to csv.
    flushImmediately Jeśli ustawiono wartość true, ujście opróżnia bufor po każdym zdarzeniu dziennika. Wartość domyślna to false.

    Aby uzyskać więcej opcji, zobacz Opcje ujścia.

  3. Wysyłanie danych do usługi Kusto przy użyciu ujścia Log4j 2. Na przykład:

    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. Skompiluj i uruchom aplikację.

  5. Sprawdź, czy dane są w klastrze. W środowisku zapytania uruchom następujące zapytanie, zastępując symbol zastępczy nazwą tabeli, która była używana wcześniej:

    <TableName>
    | take 10
    

Uruchamianie przykładowej aplikacji

  1. Sklonuj repozytorium git log4J 2 przy użyciu następującego polecenia git:

    git clone https://github.com/Azure/azure-kusto-log4j.git
    
  2. Ustaw następujące zmienne środowiskowe, aby skonfigurować ujście log4J 2:

    Uwaga

    W przykładowym projekcie zawartym w repozytorium git domyślny format konfiguracji jest zdefiniowany w pliku log4j2.xml. Ten plik konfiguracji znajduje się w ścieżce pliku: \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. W terminalu przejdź do folderu samples sklonowanego repozytorium i uruchom następujące polecenie narzędzia Maven:

    mvn compile exec:java -Dexec.mainClass="org.example.KustoLog4JSampleApp"
    
  4. W środowisku zapytań wybierz docelową bazę danych i uruchom następujące zapytanie, aby eksplorować pozyskane dane, zastępując symbol zastępczy TableName nazwą tabeli docelowej:

    <TableName>
    | take 10
    

    Dane wyjściowe powinny wyglądać podobnie do poniższej tabeli:

    Zrzut ekranu przedstawiający tabelę z funkcją take 10 i wynikami.