次の方法で共有


Apache log4J 2 コネクタを使用してデータを取得する

Log4J は、Apache Foundation によって管理される Java アプリケーションの一般的なログ記録フレームワークです。 Log4J を使用すると、開発者はロガーの名前、ロガーのレベル、メッセージ パターンに基づいて任意の粒度で出力されるログ ステートメントを制御できます。 Apache Log4J 2 は Log4J へのアップグレードであり、上記の Log4j 1.x よりも大幅に改善されています。 Log4J 2 では、Logback のアーキテクチャに固有の問題を修正しながら、Logback で利用できる機能強化の多くが提供されています。 アペンダーとも呼ばれる Apache log4J 2 シンクでは、ログ データを Kusto のテーブルにストリーミングし、ログをリアルタイムで分析および視覚化できます。

データ コネクタの完全な一覧については、「データ統合の概要」を参照してください。

前提条件

環境を設定する

このセクションでは、Log4J 2 シンクを使用する環境を準備します。

パッケージをインストールする

アプリケーションでシンクを使用するには、pom.xml Maven ファイルに次の依存関係を追加します。 シンクは、log4j-core がアプリケーションの依存関係として提供されていることを想定しています。

<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 アプリの登録を作成する

  1. Azure CLI 経由で Azure サブスクリプションにサインインします。 次に、ブラウザーで認証します。

    az login
    
  2. プリンシパルをホストするサブスクリプションを選択します。 この手順は、複数のサブスクリプションがある場合に必要です。

    az account set --subscription YOUR_SUBSCRIPTION_GUID
    
  3. サービス プリンシパルを作成します。 この例では、サービス プリンシパルを my-service-principal と呼びます。

    az ad sp create-for-rbac -n "my-service-principal" --role Contributor --scopes /subscriptions/{SubID}
    
  4. 返された JSON データから、appIdpassword、および tenant を後で使用のためにコピーします。

    {
      "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 アプリケーションとサービス プリンシパルが作成されました。

Microsoft Entra アプリにアクセス許可を付与する

  1. クエリ環境で、次の管理コマンドを実行し、プレースホルダー DatabaseNameアプリケーション ID を以前に保存した値に置き換えます。 このコマンドは、データベース インジェスター ロールをアプリに付与します。 詳細については、「データベース セキュリティ ロールの管理」を参照してください。

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

    Note

    最後のパラメーターは、データベースに関連付けられているロールに対してクエリを実行するときに、メモとして表示される文字列です。 詳細については、「データベース ロールの管理」を参照してください。

テーブルとインジェストのマッピングを作成する

受信データのターゲット テーブルを作成し、取り込まれたデータ列をターゲット テーブル内の列にマッピングします。 次の手順では、テーブル スキーマとマッピングは、サンプル アプリから送信されたデータに対応します。

  1. クエリ エディターで、次のテーブル作成コマンドを実行し、プレースホルダー TableName をターゲット テーブルの名前に置き換えます:

    .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. 次のインジェスト マッピング コマンドを実行し、プレースホルダー TableName をターゲット テーブル名に置き換え、TableNameMapping をインジェスト マッピングの名前に置き換えます:

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

Log4j 2 シンクをアプリに追加する

次の手順を使用して、以下を行います:

  • Log4j 2 シンクをアプリに追加する
  • シンクで使用される変数を構成する
  • アプリをビルドして実行する
  1. 次のコードをアプリに追加します:

    package com.microsoft.azure.kusto.log4j.sample;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
  2. log4j2.xml ファイルに KustoStrategy エントリを追加して Log4j 2 シンクを構成し、以下に従うテーブルの情報を使用してプレースホルダーを置き換えます:

    log4J 2 コネクタは、RollingFileAppender で使用されるカスタム戦略を使用します。 Kusto クラスターへの接続中にネットワーク障害によって発生するデータ損失を防ぐために、ログがローリング ファイルに書き込まれます。 データはローリング ファイルに格納され、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"
    />
    
    プロパティ 説明
    clusterIngestUrl 形式 https://ingest-<cluster>.<region>.kusto.windows.net のクラスターの取り込み URI。
    dbName 大文字と小文字が区別される、ターゲット データベースの名前。
    tableName 大文字と小文字が区別される、既存のターゲット テーブルの名前。 たとえば、Log4jTest は、テーブルの作成とインジェスト マッピングで作成されたテーブルの名前です。
    appId 認証に必要なアプリケーション クライアント ID。 Microsoft Entra アプリの登録の作成にこの値を保存しました。
    appKey 認証に必要なアプリケーション キー。 Microsoft Entra アプリの登録の作成にこの値を保存しました。
    appTenant アプリケーションが登録されているテナントの ID。 Microsoft Entra アプリの登録の作成にこの値を保存しました。
    logTableMapping マッピングの名前。
    mappingType 使用するマッピングの種類。 既定値は csv です。
    flushImmediately true に設定すると、シンクは各ログ イベントの後にバッファーをフラッシュします。 既定値は false です。

    その他のオプションについては、「シンク オプション」を参照してください。

  3. Log4j 2 シンクを使用して Kusto にデータを送信します。 次に例を示します。

    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. アプリをビルドし、実行します。

  5. データがクラスター内にあることを確認します。 クエリ環境で、プレースホルダーを以前使用したテーブルの名前に置き換えて、次のクエリを実行します:

    <TableName>
    | take 10
    

サンプル アプリを実行する

  1. 次の git コマンドを使用して、log4J 2 git リポジトリを複製します:

    git clone https://github.com/Azure/azure-kusto-log4j.git
    
  2. Log4J 2 シンクを構成するには、次の環境変数を設定します:

    Note

    git リポジトリに含まれるサンプル プロジェクトでは、既定の構成形式がファイル log4j2.xmlで定義されます。 この構成ファイルは、ファイル パス: \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. ターミナルで、複製されたリポジトリのサンプル フォルダーに移動し、次の Maven コマンドを実行します:

    mvn compile exec:java -Dexec.mainClass="org.example.KustoLog4JSampleApp"
    
  4. クエリ環境で、ターゲット データベースを選択し、次のクエリを実行して取り込まれたデータを調べ、プレースホルダー TableName をターゲット テーブルの名前に置き換えます:

    <TableName>
    | take 10
    

    出力は次のテーブルのようになります:

    take 10 関数と結果を含むテーブルのスクリーンショット。