Azure Monitor エージェントを使用してテキスト ログを収集する

多くのアプリケーションは、Windows イベント ログや Syslog などの標準のログ記録サービスの代わりに、テキスト ファイルに情報を記録します。 この記事では、データ収集規則 (DCR) を作成し、Azure Monitor エージェントを使用して監視対象のマシンからテキスト ログを収集する方法について説明します。

前提条件

この手順を完了するには、以下が必要です。

  • 少なくとも共同作成者権限がある Log Analytics ワークスペース。

  • データ収集エンドポイント

  • ワークスペースにデータ収集ルール オブジェクトを作成するためのアクセス許可

  • テキスト ファイルにログを書き込む、VM、仮想マシン スケール セット、または Arc 対応オンプレミス サーバー。

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

    • Azure Monitor エージェントが実行されているコンピューターのローカル ドライブと、監視対象のディレクトリにファイルを格納します。
    • レコードの末尾を行の末尾で示してください。
    • ASCII または UTF-8 エンコードを使用してください。 UTF-16 など他の形式はサポートされていません。
    • 古いファイルを簡単に削除できるように、毎日新しいログ ファイルを作成してください。
    • 監視対象ディレクトリ内の 2 日以上前のログ ファイルをすべてクリーンアップしてください。 Azure Monitor エージェントでは古いログ ファイルが削除されないため、追跡でエージェント リソースが使用されます。
    • 既存のファイルを新しいデータで上書きしないでください。 新しいデータはファイルに追加するのみにする必要があります。
    • ログの記録対象ファイルは、名前を変更したり、同じ名前で新たに開いたりしないでください。
    • 大規模ログ ファイルの名前を変更したり、監視対象のディレクトリにコピーしたりしないでください。 必要な場合は、1 分あたり 50 MB を超えないようにしてください
    • 監視対象ディレクトリ内のファイルの名前を、監視対象ディレクトリに存在する新しい名前に変更しないでください。 これにより、誤ったインジェスト動作が発生する可能性があります。

カスタム テーブルを作成する

この手順では、新しいカスタム テーブルを作成します。これは、_CL で終わる任意のテーブル名です。 現在、テーブルの作成には、テーブル管理エンドポイントへの直接の REST 呼び出しが使われます。 このセクションの最後にあるスクリプトは、REST 呼び出しへの入力です。

スクリプトで作成されたテーブルは、TimeGenerated: datetime と RawData: string の 2 つの列を持っており、これはカスタム テキスト ログの既定のスキーマとなっています。 最終的なスキーマがわかっている場合は、テーブルを作成する前にスクリプトに列を追加できます。 それ以外の場合は、ログ分析テーブルの UI でいつでも列を追加できます。

REST 呼び出しを行う最も簡単な方法は、Azure Cloud PowerShell コマンドライン (CLI) から行うことです。 シェルを開くには、Azure portal に移動し、[Cloud Shell] ボタンを押して、[PowerShell] を選択します。 この Azure Cloud PowerShell を初めて使う場合は、1 回限りの構成ウィザードを初めから終わりまで実施する必要があります。

次のスクリプトをコピーして PowerShell に貼り付け、ワークスペースにテーブルを作成します。 スクリプト内の {subscription}、{resource group}、{workspace name}、{table name} を置き換えます。 パラメーターの先頭または末尾に余分な空白がないことを確認します

$tableParams = @'
{
   "properties": {
       "schema": {
              "name": "{TableName}_CL",
              "columns": [
       {
                               "name": "TimeGenerated",
                               "type": "DateTime"
                       }, 
                      {
                               "name": "RawData",
                               "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

リターン キーを押して、コードを実行します。 200 応答が表示され、先ほど作成したばかりのテーブルの詳細が表示されます。 テーブルが作成されたことを確認するには、ワークスペースに移動して、左側のブレードから [テーブル] を選びます。 リストに作成したテーブルが表示されます。

Note

列名では大文字と小文字が区別されます。 たとえば、Rawdata では、イベント データが正確に収集されません。 RawData にする必要があります。

テキスト ログを収集するデータ収集ルールを作成する

データ収集ルールでは、次を定義します。

  • Azure Monitor エージェントが新しいイベントをスキャンするソース ログ ファイル。
  • インジェスト中に Azure Monitor がイベントを変換する方法。
  • Azure Monitor がデータを送信する宛先 Log Analytics ワークスペースとテーブル。

データ収集ルールを定義して、複数のマシンから複数の Log Analytics ワークスペース (異なるリージョンまたはテナントのワークスペースを含む) にデータを送信できます。 Log Analytics ワークスペースと "同じリージョン" にデータ収集ルールを作成します。

注意

テナント間でデータを送信するには、まず Azure Lighthouse を有効にする必要があります。

Azure portal でデータ収集ルールを作成するには、次を行います。

  1. [モニター] メニューで、[データ収集ルール] を選択します。

  2. [作成] を選択して、新しいデータ収集ルールと関連付けを作成します。

    [データ収集ルール] 画面の [作成] ボタンを示すスクリーンショット。

  3. 次のようにルール名を入力し、サブスクリプションリソース グループリージョンプラットフォームの種類データ収集エンドポイントを指定します。

    • [リージョン] により、DCR が作成される場所を指定します。 仮想マシンとそれらの関連付けは、テナント内の任意のサブスクリプションまたはリソース グループに配置できます。
    • [プラットフォームの種類] により、このルールを適用できるリソースの種類を指定します。 [カスタム] オプションにより、Windows と Linux の両方の種類が許可されます。
    • カスタム ログを収集するには、データ収集エンドポイントが必要です。

    [データ収集ルール] 画面の [基本] タブを示すスクリーンショット。

  4. [リソース] タブで、次の操作を実行します。

    1. [+ リソースの追加] を選択し、データ収集ルールにリソースを関連付けます。 リソースは、Azure 仮想マシン、Virtual Machine Scale Sets、Azure Arc for servers のいずれかです。 Azure portal は、まだインストールされていないリソースに Azure Monitor エージェントをインストールします。

      重要

      ポータルは、既存のユーザー割り当て ID と共に、ターゲット リソースでシステム割り当てマネージド ID を有効にします (該当する場合)。 既存のアプリケーションでは、ユーザー割り当て ID を要求で指定しない限り、マシンでは既定でシステム割り当て ID が代わりに使用されます。

      プライベート リンクを使用したネットワークの分離が必要な場合は、それぞれのリソースに対して同じリージョンから既存のエンドポイントを選択するか、新しいエンドポイントを作成します

    2. [データ収集エンドポイントを有効にする] を選択します。

    3. データ収集ルールに関連付ける各リソースのデータ収集エンドポイントを選択します。

    [データ収集ルール] 画面の [リソース] タブを示すスクリーンショット。

  5. [収集と配信] タブで、[データ ソースの追加] を選択して、データ ソースを追加し、送信先を設定します。

  6. [カスタム テキスト ログ] を選択します。

    Azure portal のデータ収集ルールの [データ ソースの追加] 画面を示すスクリーンショット。

  7. 次の情報を指定します。

    • ファイル パターン - ログ ファイルがローカル ディスク上のどこにあるかを識別します。 複数のファイル パターンをコンマで区切って入力できます (Linux では、ファイル パターンのコンマ区切りの一覧から収集するには、AMA バージョン 1.26 以上が必要です)。

      有効な入力の例:

      • 20220122-MyLog.txt
      • ProcessA_MyLog.txt
      • ErrorsOnly_MyLog.txt, WarningOnly_MyLog.txt

      Note

      同じ種類の複数のログ ファイルは、通常、同じディレクトリに存在します。 たとえば、マシンが毎日新しいファイルを作成して、ログ ファイルが大きくなりすぎないようにすることができます。 このシナリオでログ データを収集するには、ファイル ワイルドカードを使用できます。 Windows 用 C:\directoryA\directoryB\*MyLog.txt と Linux 用 /var/*.log の形式を使用します。 ディレクトリ ワイルドカードはサポートされません。

    • テーブル名 - Log Analytics ワークスペースで作成した変換先テーブルの名前。 詳細については、「前提条件」を参照してください。

    • レコード区切り記号 - 現在サポートされている行の末尾 (/r/n) 以外の区切り記号を許可するために、今後使用されます。

    • 変換 - インジェスト時変換を追加するか、収集されたデータを変換する必要がない場合はソースのままにします。

  8. [送信先] タブで、データ ソースの 1 つ以上の送信先を追加します。 同じタイプまたは異なるタイプの送信先を複数選択できます。 たとえば、複数の Log Analytics ワークスペース (マルチホームとも呼ばれます) を選択できます。

    Azure portal のデータ収集ルールの [データ ソースの追加] 画面の宛先テーブルを示すスクリーンショット。

  9. [確認と作成] を選択して、データ収集ルールの詳細と、一連の仮想マシンとの関連付けを確認します。

  10. [作成] を選択してデータ収集ルールを作成します。

Note

データ収集ルールを作成した後、データが送信先に送信されるまでに最大で 5 分かかることがあります。

サンプル ログ クエリ

ここで使用する列名は、例として示しているだけです。 ほとんどの場合、ご使用のログの列名は異なります。

  • コード別にイベントの数をカウントします。

    MyApp_CL
    | summarize count() by code
    

サンプルのアラート ルール

  • エラー イベントに対するアラート ルールを作成します。

    MyApp_CL
    | where status == "Error"
    | summarize AggregatedValue = count() by Computer, bin(TimeGenerated, 15m)
    

トラブルシューティング

テキスト ログの収集をトラブルシューティングするには、次の手順を使用します。

カスタム ログが受信されているかどうかを確認する

まず、Log Analytics で次のクエリを実行して、カスタム ログ テーブルのレコードが収集されているかどうかを確認します。 レコードが返されない場合は、考えられる原因について他のセクションを確認してください。 このクエリは過去 2 日間のエントリを検索しますが、別の時間範囲に変更できます。 テーブルの新しいデータがアップロードされるまでに 5 から 7 分かかる場合があります。 アップロードされるのは新しいデータのみです。DCR ルールが作成される前に最後に書き込まれたログ ファイルはアップロードされません。

<YourCustomLog>_CL
| where TimeGenerated > ago(48h)
| order by TimeGenerated desc

カスタム テーブルを作成したことを確認する

Log Analytics ワークスペースにデータを送信する前に、カスタム ログ テーブルを作成する必要があります。

エージェントがハートビートを正常に送信していることを確認する

Log Analytics で次のクエリを実行して、ハートビート テーブルにレコードがあるかどうかを確認することで、Azure Monitor エージェントが正しく通信していることを検証します。

Heartbeat
| where TimeGenerated > ago(24h)
| where Computer has "<computer name>"
| project TimeGenerated, Category, Version
| order by TimeGenerated desc

データ収集ルールで正しいログの場所を指定したことを確認します

データ収集ルールには、次のようなセクションがあります。 filePatterns 要素は、エージェント コンピューターから収集するログ ファイルへのパスを指定します。 エージェント コンピューターを調べて、これが正しいことを確認します。

"dataSources": [{
            "configuration": {
                "filePatterns": ["C:\\JavaLogs\\*.log"],
                "format": "text",
                "settings": {
                    "text": {
                        "recordStartTimestampFormat": "yyyy-MM-ddTHH:mm:ssK"
                    }
                }
            },
            "id": "myTabularLogDataSource",
            "kind": "logFile",
            "streams": [{
                    "stream": "Custom-TabularData-ABC"
                }
            ],
            "sendToChannels": ["gigl-dce-00000000000000000000000000000000"]
        }
    ]

このファイル パターンは、エージェント マシン上のログに対応している必要があります。

エージェント マシン上のテキスト ログ ファイルのスクリーンショット。

テキスト ログが設定されていることを確認する

エージェントは、収集対象のログ ファイルに書き込まれた新しいコンテンツのみを収集します。 テキスト ログの収集機能を試している場合は、次のスクリプトを使用してサンプル ログを生成できます。

# This script writes a new log entry at the specified interval indefinitely.
# Usage:
# .\GenerateCustomLogs.ps1 [interval to sleep]
#
# Press Ctrl+C to terminate script.
#
# Example:
# .\ GenerateCustomLogs.ps1 5

param (
    [Parameter(Mandatory=$true)][int]$sleepSeconds
)

$logFolder = "c:\\JavaLogs"
if (!(Test-Path -Path $logFolder))
{
    mkdir $logFolder
}

$logFileName = "TestLog-$(Get-Date -format yyyyMMddhhmm).log"
do
{
    $count++
    $randomContent = New-Guid
    $logRecord = "$(Get-Date -format s)Z Record number $count with random content $randomContent"
    $logRecord | Out-File "$logFolder\\$logFileName" -Encoding utf8 -Append
    Start-Sleep $sleepSeconds
}
while ($true)

ログを Microsoft と共有する

すべてが正しく構成されているにもかかわらず、ログ データが収集されない場合は、次の手順に従って Azure Monitor エージェントの診断ログを収集して、Azure Monitor グループと共有します。

  1. 管理者特権の PowerShell ウィンドウを開きます。
  2. ディレクトリを C:\Packages\Plugins\Microsoft.Azure.Monitor.AzureMonitorWindowsAgent\[version]\ に変更します。
  3. スクリプト .\CollectAMALogs.ps1 を実行します。
  4. デスクトップに生成された AMAFiles.zip ファイルを共有します。

次のステップ

各項目の詳細情報