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 dowolną 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 poprzednim dzienniku Log4j 1.x. Usługa Log4J 2 udostępnia wiele ulepszeń dostępnych w usłudze Logback, a jednocześnie naprawia 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 użycia ujścia 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 element log4j-core jest dostarczany 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 Microsoft Entra

  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 zapytania 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 kroki, 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 usługi 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 programie 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 stopniowej, 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ść Opis
    clusterIngestUrl Identyfikator URI pozyskiwania klastra w klastrze> formatuhttps://ingest-<.<region.kusto.windows.net>.
    Dbname Uwzględniana wielkość liter nazwa docelowej bazy danych.
    Tablename Rozróżniana wielkość liter w istniejącej tabeli docelowej. Na przykład Log4jTest jest nazwą tabeli utworzonej w sekcji Tworzenie tabeli i mapowania pozyskiwania.
    appId Identyfikator klienta aplikacji wymagany do uwierzytelniania. Zapisano tę wartość w sekcji Tworzenie rejestracji aplikacji Microsoft Entra.
    appKey Klucz aplikacji wymagany do uwierzytelniania. Zapisano tę wartość w sekcji Tworzenie rejestracji aplikacji Microsoft Entra.
    appTenant Identyfikator dzierżawy, w której zarejestrowano aplikację. Zapisano tę wartość w sekcji Tworzenie rejestracji aplikacji Microsoft Entra.
    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ę pod ścieżką 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 zapytania wybierz docelową bazę danych i uruchom następujące zapytanie, aby zbadać 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.