Aracılığıyla paylaş


Apache log4J 2 bağlayıcısı ile veri alma

Log4J, Apache Foundation tarafından tutulan Java uygulamaları için popüler bir günlük çerçevesidir. Log4J, geliştiricilerin günlükçü adı, günlükçü düzeyi ve ileti desenine göre rastgele ayrıntı düzeyiyle hangi günlük deyimlerinin çıkış olduğunu denetlemesine olanak tanır. Apache Log4J 2 , önceki Log4j 1.x üzerinde önemli geliştirmeler içeren bir Log4J yükseltmesidir. Log4J 2, Logback mimarisindeki bazı doğal sorunları giderirken Logback'te sunulan iyileştirmelerin çoğunu sağlar. Ekleyici olarak da bilinen Apache log4J 2 havuzu, günlük verilerinizi Kusto'daki tablonuza akışla aktararak günlüklerinizi gerçek zamanlı olarak analiz edip görselleştirebilirsiniz.

Veri bağlayıcılarının tam listesi için bkz . Veri tümleştirmelerine genel bakış.

Önkoşullar

Ortamınızı ayarlama

Bu bölümde ortamınızı Log4J 2 havuzu kullanacak şekilde hazırlarsınız.

paketini yükleyin

Havuzu bir uygulamada kullanmak için pom.xml Maven dosyanıza aşağıdaki bağımlılıkları ekleyin. Havuz, log4j-core'un uygulamada bir bağımlılık olarak sağlanmasını bekler.

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

Microsoft Entra Uygulama kaydı oluşturma

  1. Azure CLI aracılığıyla Azure aboneliğinizde oturum açın. Ardından tarayıcıda kimlik doğrulaması yapın.

    az login
    
  2. Sorumluyu barındırmak için aboneliği seçin. Bu adım, birden çok aboneliğiniz olduğunda gereklidir.

    az account set --subscription YOUR_SUBSCRIPTION_GUID
    
  3. Hizmet sorumlusunu oluşturun. Bu örnekte hizmet sorumlusu olarak adlandırılır my-service-principal.

    az ad sp create-for-rbac -n "my-service-principal" --role Contributor --scopes /subscriptions/{SubID}
    
  4. Döndürülen JSON verilerinden, gelecekte kullanmak üzere , passwordve tenant değerini kopyalayınappId.

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

Microsoft Entra uygulamanızı ve hizmet sorumlunuzu oluşturdunuz.

Microsoft Entra uygulaması izinlerini verme

  1. Sorgu ortamınızda aşağıdaki yönetim komutunu çalıştırın ve DatabaseName ve uygulama kimliği yer tutucularını daha önce kaydedilmiş değerlerle değiştirin. Bu komut uygulamaya veritabanı alma rolü verir. Daha fazla bilgi için bkz . Veritabanı güvenlik rollerini yönetme.

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

    Not

    Son parametre, bir veritabanıyla ilişkili rolleri sorguladığınızda not olarak gösterilen bir dizedir. Daha fazla bilgi için bkz . Veritabanı rollerini yönetme.

Tablo ve alma eşlemesi oluşturma

Alınan veri sütunlarını hedef tablodaki sütunlara eşleerek gelen veriler için bir hedef tablo oluşturun. Aşağıdaki adımlarda, tablo şeması ve eşleme örnek uygulamadan gönderilen verilere karşılık gelir.

  1. Sorgu düzenleyicinizde aşağıdaki tablo oluşturma komutunu çalıştırın ve TableName yer tutucusunu hedef tablonun adıyla değiştirin:

    .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. Aşağıdaki alma eşleme komutunu çalıştırarak TableName yer tutucularını hedef tablo adıyla ve TableNameMapping öğesini alma eşlemesinin adıyla değiştirin:

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

Uygulamanıza Log4j 2 havuzu ekleme

Aşağıdaki adımları kullanarak:

  • Uygulamanıza Log4j 2 havuzu ekleme
  • Havuz tarafından kullanılan değişkenleri yapılandırma
  • Uygulamayı derleyin ve çalıştırın
  1. Aşağıdaki kodu uygulamanıza ekleyin:

    package com.microsoft.azure.kusto.log4j.sample;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
  2. Log4j 2 havuzu, log4j2.xml dosyasına girdisini ekleyerek KustoStrategy yapılandırın ve aşağıdaki tablodaki bilgileri kullanarak yer tutucuları değiştirin:

    log4J 2 bağlayıcısı RollingFileAppender içinde kullanılan özel bir strateji kullanır. Günlükler, Kusto kümesine bağlanırken ağ hatasından kaynaklanan veri kaybını önlemek için sıralı dosyaya yazılır. Veriler sıralı bir dosyada depolanır ve kusto kümesine boşaltılır.

    <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"
    />
    
    Özellik Açıklama
    clusterIngestUrl Kümenizin biçim https://ingest-<>kümesindeki alma URI'si.<region.kusto.windows.net>.
    dbName Hedef veritabanının büyük/küçük harfe duyarlı adı.
    tableName Var olan bir hedef tablonun büyük/küçük harfe duyarlı adı. Örneğin Log4jTest, Tablo oluşturma ve alma eşlemesi bölümünde oluşturulan tablonun adıdır.
    appId Kimlik doğrulaması için gereken uygulama istemci kimliği. Bu değeri Microsoft Entra Uygulaması kaydı oluşturma bölümüne kaydettiniz.
    appKey Kimlik doğrulaması için gereken uygulama anahtarı. Bu değeri Microsoft Entra Uygulaması kaydı oluşturma bölümüne kaydettiniz.
    appTenant Uygulamanın kayıtlı olduğu kiracının kimliği. Bu değeri Microsoft Entra Uygulaması kaydı oluşturma bölümüne kaydettiniz.
    logTableMapping Eşlemenin adı.
    mappingType Kullanılacak eşleme türü. Varsayılan değer csv'dir.
    flushImmediately true olarak ayarlanırsa havuz, her günlük olayından sonra arabelleği temizler. Varsayılan değer false'tur.

    Diğer seçenekler için bkz . Havuz Seçenekleri.

  3. Log4j 2 havuzu kullanarak Kusto'ya veri gönderin. Örneğin:

    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. Uygulamayı derleyin ve çalıştırın.

  5. Verilerin kümenizde olduğunu doğrulayın. Sorgu ortamınızda aşağıdaki sorguyu çalıştırarak yer tutucuyu daha önce kullanılan tablonun adıyla değiştirin:

    <TableName>
    | take 10
    

Örnek uygulamayı çalıştırma

  1. Aşağıdaki git komutunu kullanarak log4J 2 git deposunu kopyalayın:

    git clone https://github.com/Azure/azure-kusto-log4j.git
    
  2. Log4J 2 havuzu yapılandırmak için aşağıdaki ortam değişkenlerini ayarlayın:

    Not

    Git deposuna dahil edilen örnek projede, varsayılan yapılandırma biçimi dosya log4j2.xml tanımlanır. Bu yapılandırma dosyası şu dosya yolunun altında bulunur: \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. Terminalinizde, kopyalanan deponun samples klasörüne gidin ve aşağıdaki Maven komutunu çalıştırın:

    mvn compile exec:java -Dexec.mainClass="org.example.KustoLog4JSampleApp"
    
  4. Sorgu ortamınızda hedef veritabanını seçin ve alınan verileri keşfetmek için aşağıdaki sorguyu çalıştırın ve TableName yer tutucusunu hedef tablonun adıyla değiştirin:

    <TableName>
    | take 10
    

    Çıktınız aşağıdaki tabloya benzer görünmelidir:

    10 işlev ve sonuçları içeren tablonun ekran görüntüsü.