Azure Log Analyticsでよく使うKQLまとめ|ログ検索・絞り込み・集計

Azure LogAnalytics
この記事は約13分で読めます。

AzureのLog Analyticsでは、KQL(Kusto Query Language)を使って収集したログを検索・分析できます。

実際にログを調査していると、「特定のIPアドレスで絞りたい」「エラーだけ確認したい」「ログの件数を集計したい」など、似たようなクエリを何度も使うことがあります。

今回は、Azure Log Analyticsでよく利用するKQLをまとめてみました。

KQLでは、where で条件を絞り込み、project で表示する列を指定し、summarize で集計するといった使い方ができます。

同じくKQLが利用できるAzureDataExplorlerで利用する場合にはテーブル名が異なるかもしれないですが、クエリ自体の参考はなるかと思います。

※以下のクエリは、実際の環境やログ収集方式によってテーブル名・列名が異なる場合があります。

広告

1.LogAnalyticsでよく利用するKQL

下記のコマンドは基本的に project を利用して個人的に必要な情報のみを出力しています。

1-1. Azure Activity Logから削除操作のログを表示する

Azureリソースの削除操作を確認したい場合は、AzureActivity を使用します。

以下では、操作名に delete を含み、さらにIPアドレスが 1.1. を含むログを検索しています。

AzureActivity 
| where OperationNameValue contains "delete"
| where CallerIpAddress contains "1.1."
| project TimeGenerated, OperationNameValue, ResourceGroup, Caller, CallerIpAddress, Properties

また、project を使うことで、必要な列だけを表示できます。

1-2. Entra IDのサインイン失敗ログを表示する

Entra IDのサインインログは SigninLogs テーブルで確認できます。

ResultType が 0 以外のログを抽出することで、成功以外のサインイン結果を確認できます。

SigninLogs 
| where OperationName == "Sign-in activity"
| where ResultType != 0
| project TimeGenerated, OperationName, ResultSignature, ResultType, IPAddress, Status, UserDisplayName, UserId, UserPrincipalName

1-3. Azure Firewallでdenyされたログを表示する

Azure Firewallのログから、拒否された通信を確認する場合のクエリ例です。

AzureDiagnostics
| where TimeGenerated between (datetime("2025-09-24 00:00:00.000+09:00") .. datetime("2025-09-25 00:00:00.000+09:00"))
| where Action_s contains "deny"

1-4. Azure Firewallのネットワークルールから特定IP・アクションのログを表示する

特定の送信先IPアドレスに対する通信を調べたい場合は、IPアドレスで絞り込みます。

DestinationIp_s や Action_s などの列名は、実際に収集されているログのスキーマを確認するとよいです。

AzureDiagnostics
| where TimeGenerated between (datetime("2025-09-24 00:00:00.000+09:00") .. datetime("2025-09-25 00:00:00.000+09:00"))
| where Category == "AZFWNetworkRule"
| where DestinationIp_s contains "23.192."
| where Action_s contains "allow"

1-5. Azure Firewallのアプリケーションルールから特定FQDNのログを表示する

Azure Firewallのアプリケーションルールに対して、特定のFQDNやルール名で絞り込むこともできます。

特定のWebサイトへのアクセス状況などを調査するときによく利用します。

AzureDiagnostics
| where TimeGenerated between (datetime("2025-09-24 00:00:00.000+09:00") .. datetime("2025-09-25 00:00:00.000+09:00"))
| where Category == "AZFWApplicationRule"
| where Fqdn_s contains "yahoo.co.jp"
| where Rule_s contains "Allow-Internet"

1-6. Application Gatewayのアクセスログから特定IPのエラーを表示する

Application Gatewayのアクセスログから、特定のIPアドレスによるHTTPステータス200以外のアクセスを確認します。

Application Gatewayのアクセスログでは ClientIP という列名になっています。

AzureDiagnostics
| where TimeGenerated between (datetime("2025-09-10 00:00:00.000+09:00") .. datetime("2025-09-11 00:00:00.000+09:00"))
| where Category == "ApplicationGatewayAccessLog"
| where ClientIP contains "1.1.1.1"
| where httpStatus_d != 200

1-7. Application Gatewayからバックエンドへの応答がないログを表示する

基本的にはバックエンドの serverStatus には値が入っていますが、ApplicationGateway自体の障害時などには serverStatus に値が入らなくなることがあります。

その状態のログを判断するためのクエリです。

AzureDiagnostics
| where TimeGenerated between (datetime("2025-09-10 00:00:00.000+09:00") .. datetime("2025-09-11 00:00:00.000+09:00"))
| where Category == "ApplicationGatewayAccessLog"
| where serverStatus_d == "-" or serverStatus_d == ""
| where httpStatus_d >= 500

Application Gateway の障害調査などで、バックエンドから正常な応答を取得できているか確認するときによく利用します。

1-8. Application Gateway のWAFログから特定IPのログを表示する

Application Gateway のWAFログを確認する場合は、ApplicationGatewayFirewallLog を指定します。

アクセスログでは ClientIP、WAFログでは ClientIp (小文字)となっている点に注意が必要です。

AzureDiagnostics
| where TimeGenerated between (datetime("2025-09-10 00:00:00.000+09:00") .. datetime("2025-09-11 00:00:00.000+09:00"))
| where Category == "ApplicationGatewayFirewallLog"
| where ClientIp contains "1.1.1.1"
| where httpStatus_d != 200

1-9. summarizeでログの件数を集計する

summarize を利用して合計値を表示できます。

今回は AzureFirewallログの Azure Firewallのアプリケーションルールのログ件数の合計値を表示しています。

AzureDiagnostics
| where TimeGenerated between (datetime("2025-09-24 00:00:00.000+09:00") .. datetime("2025-09-25 00:00:00.000+09:00"))
| where Category == "AZFWApplicationRule"
| summarize count() by Category

count() を使うことで、条件に一致したログの件数を確認できます。

KQLでは sum や count などの集計関数と sumarize を組み合わせて利用します。

summarize はグループ単位で集計結果を作成するため、ログ件数の確認によく利用します。

1-10. 常に先月のログを取得する

毎月同じクエリを実行する場合、日付を毎回変更するのは面倒です。

extend と now() を利用して常に先月の期間を指定して出力することができます。
毎月自動実行するクエリなどで利用すると楽です。

以下では、先月のサインインログを出力するクエリです。

SigninLogs
| extend today_month_Y = datetime_part("Year",now())
| extend last_month_Y = datetime_part("Year",now(-20d))
| extend today_M = datetime_part("Month",now())
| extend last_M = datetime_part("Month",now(-20d))
| extend now_day1 = strcat(tostring(today_month_Y), "-", tostring(today_M), "-", "01", "T23:59:59+09:00")
| extend last_month_day1 = strcat(tostring(last_month_Y), "-", tostring(last_M), "-", "01", "T00:00:00+09:00")
| extend date_now_day1 = todatetime(now_day1)
| extend date_last_month_day1 = todatetime(last_month_day1)
| extend last_Month_end_day = date_now_day1 - 1d
| extend startDate = date_last_month_day1
| extend endDate = last_Month_end_day
| where TimeGenerated between(startDate .. endDate)
| where OperationName == "Sign-in activity"

1-11. Windowsのログインログを表示する

Windowsのイベントログから、ログオン成功とログオン失敗を確認する場合のクエリ例です。

ログオン成功はイベントID 4624、ログオン失敗は 4625 です。

Event
| where EventID == 4624 or EventID == 4625
| project TimeGenerated, Source, EventLog, EventLevel, EventData, EventID, RenderedDescription, EventCategory

1-12. Syslogを表示する

Linuxなどから収集したSyslogを確認する場合は、Syslog テーブルを使用します。

今回は、VM名が vm を含む仮想マシンに絞って出力させています。

Syslog
| where Computer contains "vm"
| project TimeGenerated, SourceSystem, Computer, Facility, HostName, SeverityLevel, SyslogMessage, ProcessID, HostIP

1-13. Heartbeat ログを表示

Azure Monitor Agent などで収集しているVMの Heartbeat ログを確認する場合は、Heartbeat テーブルを使用します。

Heartbeat
| project TimeGenerated, Computer, ComputerIP, ComputerPrivateIPs, OSType, OSName, OSMajorVersion, OSMinorVersion, Version, ResourceGroup, Resource, VMUUID

1-14. M365のログを表示

Microsoft 365の操作ログを確認する場合は、OfficeActivity テーブルを使用します。

このテーブルを利用すると、SharePointOnlineのファイルアップロード/ダウンロードのログも見ることができます。

OfficeActivity

1-15. blobの操作ログを表示

Azure Blob Storageに対する操作ログは、StorageBlobLogs テーブルから確認できます。

例えば、Blobの取得操作を確認する場合は以下のようなクエリにします。

StorageBlobLogs
| where OperationName contains "Get"
| project TimeGenerated, AccountName, StatusCode, StatusText, Uri, CallerIpAddress, ObjectKey, LastModifiedTime, Category

なお、ファイルストレージのログは StorageFileLogs テーブルを利用すると確認できます。

広告

2.よく使うKQL演算子

上記で挙げたクエリの中で、特によく使用している演算子をまとめます。

演算子用途使用例
where条件を指定してログを絞り込むwhere ResultType != 0
project表示する列を指定するproject TimeGenerated, UserPrincipalName
contains文字列を含むログを検索するwhere CallerIpAddress contains "1.1."
==一致する値を検索するwhere Category == "AZFWNetworkRule"
!=一致しない値を検索するwhere ResultType != 0
between指定した範囲で検索するwhere TimeGenerated between (...)
summarizeログを集計するsummarize count()
extend計算した列などを追加するextend NewColumn = ...

where はログの絞り込み、project は表示項目の整理、summarize は集計、extend は計算列の追加というように覚えておくと分かりやすいです。

広告

3.KQLを作成するときのポイント

KQLを書くときは、最初から複雑なクエリは作れないと思います。

まずテーブルを指定して、少数のログを全項目表示して確認します。

SigninLogs
| take 10

そこから、以下のように条件を追加していくと、特定の内容に特化したクエリを作りやすくなります。

テーブルを指定
↓
whereで対象を絞る
↓
projectで必要な列だけ表示
↓
summarizeで集計

Microsoftの公式ドキュメントでも、クエリはまずテーブル名から開始する方法が推奨されており、対象を明確にすることでクエリの範囲を分かりやすくできます。

広告

4.まとめ

今回は、Azure Log Analytics で実際に利用することの多い KQL をまとめてみました。

特によく利用するのは以下の演算子です。

  • where:ログを条件で絞り込む
  • project:必要な列だけ表示する
  • contains:文字列を含むログを検索する
  • between:指定した期間のログを取得する
  • summarize:ログを集計する
  • extend:計算した列などを追加する

KQLは実際のログを、全項目、少数表示しながら条件を追加していくと特定の内容に特化したクエリを作りやすいです。

Azure Firewall、Application Gateway、Entra ID、Windows Server、Microsoft 365など、調査対象によって使用するテーブルや列が変わるため、実際の環境のスキーマを確認しながらクエリを調整すると良いです。