Azure Monitor エージェントを使用して JSON ファイルからログを収集する

カスタム JSON ログは、データ収集ルール (DCR) で使用されるデータ ソースの 1 つです。 DCR の作成の詳細については、「Azure Monitor エージェントを使用してデータを収集する」を参照してください。 この記事では、テキスト ログと JSON ログの種類の詳細について説明します。

多くのアプリケーションとサービスでは、Windows イベント ログや Syslog などの標準のログ記録サービスの代わりに、JSON ファイルに情報を記録します。 このデータは、Azure Monitor エージェントを使用して収集し、他のソースから収集されたデータを使用して Log Analytics ワークスペースに格納できます。

前提条件

基本的な操作

次の図は、JSON ファイルからログ データを収集する基本的な操作を示しています。

  1. エージェントは、ローカル ディスク上の指定された名前パターンと一致するすべてのログ ファイルを監視します。
  2. ログ内の各エントリが収集され、Azure Monitor に送信されます。 ユーザーによって定義された受信ストリームは、ログ データを列に解析するために使用されます。
  3. 受信ストリームのスキーマがターゲット テーブルのスキーマと一致する場合は、既定の変換が使用されます。

コンマ区切りのファイル コレクションの結果を返すログ クエリを示すスクリーンショット。

JSON ファイルの要件とベスト プラクティス:

Azure Monitor エージェントが監視しているファイルは、次の要件を満たしている必要があります。

  • ファイルは、Azure Monitor エージェントがあるコンピューターのローカル ドライブの、監視対象のディレクトリ内に格納する必要があります。
  • 各レコードは、行末で区切る必要があります。
  • ファイルでは、ASCII または UTF-8 エンコードを使用する必要があります。 UTF-16 など他の形式はサポートされていません。
  • 新しいレコードは、古いレコードを上書きせず、ファイルの末尾に追加する必要があります。 上書きすると、データが失われます。
  • JSON テキストは 1 行に含まれている必要があります。 JSON 本文フォーマットはサポートされません。 以下のサンプルを参照してください。

データの損失やパフォーマンスの問題が発生しないように、次の推奨事項に従ってください。

  • 古いファイルを簡単にクリーンアップできるように、毎日新しいログ ファイルを作成します。
  • 監視対象ディレクトリのログ ファイルを継続的にクリーンアップします。 多くのログ ファイルを追跡すると、エージェントの CPU とメモリの使用量が増える可能性があります。 すべてのログが処理されるための十分な時間を確保できるよう、少なくとも 2 日間待ちます。
  • ファイル スキャンのパターンと一致するファイルの名前を、ファイル スキャンのパターンと一致する別の名前に変更しないでください。 これにより、重複するデータが取り込まれることになります。
  • ファイル スキャンのパターンと一致する大規模ログ ファイルの名前を変更したり、監視対象のディレクトリにコピーしたりしないでください。 必要な場合は、1 分あたり 50 MB を超えないようにしてください。

カスタム テーブル

JSON ファイルからログ データを収集する前に、Log Analytics ワークスペースにカスタム テーブルを作成してデータを受信する必要があります。 テーブル スキーマは、受信ストリームの列と一致する必要があります。または、出力スキーマがテーブルと一致するように変換を追加する必要があります。

警告

Log Analytics エージェントが使用する既存のカスタム テーブルは使用しないでください。 最初の Azure Monitor エージェントによるテーブルへの書き込みがなされると、レガシ エージェントによるテーブルへの書き込みができなくなります。 Log Analytics エージェントのデータ損失を防止するために Azure Monitor エージェントにより使用される新しいテーブルを作成します。

たとえば、次の PowerShell スクリプトを使用して、複数の列を含むカスタム テーブルを作成できます。

$tableParams = @'
{
    "properties": {
        "schema": {
               "name": "{TableName}_CL",
               "columns": [
                    {
                        "name": "TimeGenerated",
                        "type": "DateTime"
                    }, 
                    {
                        "name": "MyStringColumn",
                        "type": "string"
                    },
                    {
                        "name": "MyIntegerColumn",
                        "type": "int"
                    },
                    {
                        "name": "MyRealColumn",
                        "type": "real"
                    },
                    {
                        "name": "MyBooleanColumn",
                        "type": "bool"
                    },
                    {
                        "name": "FilePath",
                        "type": "string"
                    },
                    {
                        "name": "Computer",
                        "type": "string"
                    }
              ]
        }
    }
}
'@

Invoke-AzRestMethod -Path "/subscriptions/{subscription}/resourcegroups/{resourcegroup}/providers/microsoft.operationalinsights/workspaces/{WorkspaceName}/tables/{TableName}_CL?api-version=2021-12-01-preview" -Method PUT -payload $tableParams

JSON ファイルのデータ収集ルールを作成する

Note

エージェントベースの JSON カスタム ファイルの取り込みは現在プレビュー段階であり、ポータルの完全な UI エクスペリエンスはまだありません。 ポータルを使用して DCR を作成できますが、受信ストリームの列を定義するために DCR を変更する必要があります。 このセクションでは、ARM テンプレートを使用して DCR を作成する方法について詳しく説明します。

着信ストリーム スキーマ

Note

区切りイベントに ISO 8601 タイム スタンプを使用する複数行のサポートは、2024 年 10 月中旬に予定されています

JSON ファイルには、各値にプロパティ名が含まれており、DCR の受信ストリームには、各プロパティ名に一致する列が含まれている必要があります。 ログの列を使用して、ARM テンプレートの columns セクションを変更する必要があります。

次の表では、ログ ファイル内のデータを定義する列の他にも含められるオプションの列について説明します。

タイプ 説明
TimeGenerated datetime レコードが生成された時刻。 レコードが受信ストリームに含まれていない場合、この値には Log Analytics ワークスペースに追加された時刻が自動的に設定されます。
FilePath string この列を DCR の受信ストリームに追加すると、ログ ファイルへのパスが設定されます。 この列は自動的には作成されず、ポータルを使用して追加することはできません。 ポータルによって作成された DCR を手動で変更するか、受信ストリームを明示的に定義できる別の方法を使用して DCR を作成する必要があります。
Computer string この列を DCR の受信ストリームに追加すると、ログ ファイルのあるコンピューターの名前が設定されます。 この列は自動的には作成されず、ポータルを使用して追加することはできません。 ポータルによって作成された DCR を手動で変更するか、受信ストリームを明示的に定義できる別の方法を使用して DCR を作成する必要があります。

変換

この変換では、受信ストリームを変更するためにレコードがフィルター処理されたり、ターゲット テーブルと一致するようにスキーマが変更されたりする可能性があります。 受信ストリームのスキーマがターゲット テーブルと同じ場合は、source の既定の変換を使用できます。 そうでない場合は、必要なスキーマを返す KQL クエリを使用して、tee ARM テンプレートの transformKql セクションを変更します。

ARM テンプレート

次の ARM テンプレートを使用して、テキスト ログ ファイルを収集するための DCR を作成し、前のセクションで説明した変更を行います。 次の表では、テンプレートを展開するときに値を必要とするパラメーターについて説明します。

設定 説明
データ収集ルール名 DCR の一意の名前。
データ収集エンドポイント リソース ID データ収集エンドポイント (DCE) のリソース ID。
場所 DCR のリージョン。 Log Analytics ワークスペースと同じ地域である必要があります。
ファイル パターン ローカル ディスク上のログ ファイルの場所と名前を確認します。 新しい名前で毎日新しいファイルが作成される場合など、異なるファイル名にはワイルドカードを使用します。 複数のファイル パターンをコンマで区切って入力できます (Linux 上の複数のファイル パターンには AMA バージョン 1.26 以降が必要です)。

例 :
- C:\Logs\MyLog.json
- C:\Logs\MyLog*.json
- C:\App01\AppLog.json、C:\App02\AppLog.json
- /var/mylog.json
- /var/mylog*.json
テーブル名 Log Analytics ワークスペースの宛先テーブルの名前。
ワークスペースのリソース ID ターゲット テーブルを含む Log Analytics ワークスペースのリソース ID。

重要

ARM テンプレートを使用して DCR を作成する場合でも、DCR を使用するエージェントに DCR を関連付ける必要があります。 Azure portal で DCR を編集し、「リソースの追加」の説明に従ってエージェントを選択します。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "dataCollectionRuleName": {
            "type": "string",
            "metadata": {
                "description": "Unique name for the DCR. "
            }
        },
        "dataCollectionEndpointResourceId": {
            "type": "string",
            "metadata": {
              "description": "Resource ID of the data collection endpoint (DCE)."
            }
        },
        "location": {
            "type": "string",
            "metadata": {
                "description": "Region for the DCR. Must be the same location as the Log Analytics workspace. "
            }
        },
        "filePatterns": {
            "type": "string",
            "metadata": {
                "description": "Path on the local disk for the log file to collect. May include wildcards.Enter multiple file patterns separated by commas (AMA version 1.26 or higher required for multiple file patterns on Linux)."
            }
        },
        "tableName": {
            "type": "string",
            "metadata": {
                "description": "Name of destination table in your Log Analytics workspace. "
            }
        },
        "workspaceResourceId": {
            "type": "string",
            "metadata": {
                "description": "Resource ID of the Log Analytics workspace with the target table."
            }
        }
    },
    "variables": {
        "tableOutputStream": "[concat('Custom-', parameters('tableName'))]"
    },
    "resources": [
        {
            "type": "Microsoft.Insights/dataCollectionRules",
            "apiVersion": "2022-06-01",
            "name": "[parameters('dataCollectionRuleName')]",
            "location": "[parameters('location')]",
            "properties": {
                "dataCollectionEndpointId": "[parameters('dataCollectionEndpointResourceId')]",
                "streamDeclarations": {
                    "Custom-Json-stream": {
                        "columns": [
                            {
                                "name": "TimeGenerated",
                                "type": "datetime"
                            },
                            {
                                "name": "FilePath",
                                "type": "string"
                            },
                            {
                                "name": "MyStringColumn",
                                "type": "string"
                            },
                            {
                                "name": "MyIntegerColumn",
                                "type": "int"
                            },
                            {
                                "name": "MyRealColumn",
                                "type": "real"
                            },
                            {
                                "name": "MyBooleanColumn",
                                "type": "boolean"
                            }
                        ]
                    }
                },
                "dataSources": {
                    "logFiles": [
                        {
                            "streams": [
                                "Custom-Json-stream"
                            ],
                            "filePatterns": [
                                "[parameters('filePatterns')]"
                            ],
                            "format": "json",
                            "name": "Custom-Json-stream"
                        }
                    ]
                },
                "destinations": {
                    "logAnalytics": [
                        {
                            "workspaceResourceId": "[parameters('workspaceResourceId')]",
                            "name": "workspace"
                        }
                    ]
                },
                "dataFlows": [
                    {
                        "streams": [
                            "Custom-Json-stream"
                        ],
                        "destinations": [
                            "workspace"
                        ],
                        "transformKql": "source",
                        "outputStream": "[variables('tableOutputStream')]"
                    }
                ]
            }
        }
    ]
}

トラブルシューティング

想定している JSON ログからデータを収集しない場合は、次の手順を実行します。

  • 収集されるログ ファイルにデータが書き込まれていることを確認します。
  • ログ ファイルの名前と場所が、指定したファイル パターンと一致することを確認します。
  • DCR の受信ストリームのスキーマが、ログ ファイルのスキーマと一致していることを確認します。
  • ターゲット テーブルのスキーマが受信ストリームと一致していること、または受信ストリームを正しいスキーマに変換する変換があることを確認します。
  • 操作の確認」を参照して、エージェントが動作していて、データが受信されているかどうかを確認します。

次のステップ

各項目の詳細情報