こんにちは、インフラエンジニアのryuです。
今回は、Azureのログを調べるときによく使うKQL(Kusto Query Language)の基本的な使い方を解説します。
KQLという名前は聞いたことがあっても、どこに入力し、何を書けばよいのか迷いますよね。
最初から難しいクエリを書く必要はありません。テーブルを表示し、whereで絞り込むところから始めれば大丈夫です。
この記事では、Azure MonitorのLog Analyticsを使いながら、初心者でも使いやすいKQLを順番に見ていきます。
KQLとは?¶
KQLはKusto Query Languageの略で、Azure Monitor LogsやMicrosoft Sentinel、Azure Data Explorerなどでデータを検索・分析するときに使われるクエリ言語です。
元の記事ではキーワードクエリ言語と説明していましたが、正しくはKusto Query Languageです。
SQLに似ている部分もありますが、書き方は少し違います。
たとえばSQLでは、次のように書きます。
SELECT *
FROM access_logs
WHERE status_code >= 500;
KQLでは、テーブル名を書いたあとに|で処理をつないでいきます。
AppServiceHTTPLogs
| where ScStatus >= 500
この|はパイプと呼ばれ、前の処理結果を次へ渡す役割があります。
代表的な処理を簡単に整理すると、次のようになります。
| KQL | できること |
|---|---|
where |
条件に合うログだけ表示する |
project |
必要な列だけ表示する |
sort |
並び替える |
distinct |
重複を除いて一覧にする |
summarize |
件数や平均値などを集計する |
take |
指定した件数だけ表示する |
まずはwhere、project、summarizeを使えれば十分です。
KQLを使う前にLog Analyticsへログを送ろう¶
KQLを書いても、Log Analyticsにデータが入っていなければ結果は表示されません。
そのため、最初にAzureリソースのログをLog Analyticsワークスペースへ送る設定が必要です。
今回は、Azure App Serviceのアクセスログを例にします。
App Serviceでは診断設定を利用して、HTTPログなどをLog Analyticsワークスペースへ送信できます。
設定方法はこちらの記事で詳しく解説しています。
【関連記事】WebAppのアクセスログを見る方法|Log Analyticsへログを送信する
Log AnalyticsでKQLを実行する¶
Azure PortalからLog Analyticsワークスペースを開き、ログの画面へ移動するとクエリを実行できます。
現在のLog Analyticsには、画面操作でログを絞り込めるシンプルモードと、自分でKQLを書くKQLモードがあります。
KQLを学ぶなら、KQLモードで実際にクエリを書いてみましょう。

画像は以前のLog Analytics画面なので、現在のAzure Portalとは配置やデザインが異なる場合があります。ただ、クエリを入力してログを確認するという基本的な使い方は同じです。
まずはテーブルのログを表示する¶
元の記事では最初に次のクエリを使っていました。
search "*"
このクエリでもログを探せますが、ワークスペース内の多くのテーブルを検索するため、現在はどのテーブルを見たいか分かっている場合は、テーブル名から始める方がおすすめです。
App ServiceのHTTPアクセスログであれば、次のようにします。
AppServiceHTTPLogs
これだけでもログを表示できます。
ログが多すぎる場合は、まず10件だけ表示してみましょう。
AppServiceHTTPLogs
| take 10
検索する時間を確認する¶
Log Analyticsでは、クエリだけでなく画面上の時間範囲も重要です。

たとえば、昨日発生したエラーを探しているのに、検索範囲が直近1時間になっていればログは表示されません。
ログが見つからないときは、時間範囲も確認するのがポイントです。

whereで必要なログだけ絞り込む¶
KQLで一番よく使うのがwhereです。
whereを使うと、指定した条件に一致するログだけを表示できます。
たとえばApp ServiceへのGETリクエストだけを見たい場合は、次のようにします。
AppServiceHTTPLogs
| where CsMethod == "GET"
AppServiceHTTPLogsには、HTTPメソッドを表すCsMethodという列があります。

ログを展開すると、どのような列が入っているのか確認できます。

たとえば500番台のHTTPエラーだけ調べたい場合は、次のように書けます。
AppServiceHTTPLogs
| where ScStatus >= 500
よく使う比較方法も簡単に整理しておきましょう。
| 書き方 | 意味 |
|---|---|
== |
等しい |
!= |
等しくない |
>= |
以上 |
<= |
以下 |
has |
単語を含む |
contains |
文字列を含む |
たとえば、特定のURLを含むアクセスを調べるなら次のようにできます。
AppServiceHTTPLogs
| where CsUriStem contains "/login"
projectで見たい列だけ表示する¶
ログには多くの列があります。
すべて表示すると横に長くなり、何を確認すればよいのか分かりづらくなることがあります。
そこで使うのがprojectです。
AppServiceHTTPLogs
| project TimeGenerated, CsMethod, CsUriStem, ScStatus, CIp
これで、時刻、HTTPメソッド、URL、ステータスコード、クライアントIPだけを表示できます。
さらにエラーだけに絞るなら、次のようにつなげます。
AppServiceHTTPLogs
| where ScStatus >= 500
| project TimeGenerated, CsMethod, CsUriStem, ScStatus, CIp
KQLは1行ずつ処理を追加できるため、長くなっても内容を追いやすいです。
distinctで重複を除いて一覧表示する¶
次にdistinctを使ってみましょう。
distinctは、同じ値をまとめて重複を除いた一覧を表示したいときに便利です。
たとえば、アクセスしてきたクライアントIPの一覧を確認するなら次のようにします。
AppServiceHTTPLogs
| distinct CIp

アクセス元IPの種類だけ確認したいときに便利です。件数まで知りたい場合はsummarizeを使います。
summarizeでログを集計する¶
ログの件数を集計したいときはsummarizeを使います。
たとえばHTTPステータスコードごとのアクセス件数を表示するなら、次のようにします。
AppServiceHTTPLogs
| summarize count() by ScStatus
これで200、404、500など、それぞれのステータスコードが何件発生しているか確認できます。
アクセス元IPごとの件数を見るなら、次のようにします。
AppServiceHTTPLogs
| summarize AccessCount = count() by CIp
| sort by AccessCount desc
上からアクセス数の多いIPが表示されます。
大量のログから必要な情報だけを絞り込み、集計できることがKQLの強みです。
よく使うKQLを組み合わせてみよう¶
たとえば500番台エラーを確認したい場合は次のようにします。
AppServiceHTTPLogs
| where ScStatus >= 500
| project TimeGenerated, CsMethod, CsUriStem, ScStatus, CIp
| sort by TimeGenerated desc
どのURLでエラーが多いのか調べるなら、次のようにできます。
AppServiceHTTPLogs
| where ScStatus >= 500
| summarize ErrorCount = count() by CsUriStem
| sort by ErrorCount desc
レスポンス時間を調べる場合は、TimeTakenを条件にして遅いリクエストだけを抽出することもできます。
search "*"はなるべく使いすぎない¶
KQLを調べると、次のクエリを見かけることがあります。
search "*"
何のテーブルにログがあるか分からないときは便利ですが、多くのテーブルや列を検索するため処理対象が増えます。
テーブルや列が分かっているなら、次のように対象を明確にする方が効率的です。
AppServiceHTTPLogs
| where ScStatus >= 500
基本は、テーブル名を書く → whereで絞ると覚えておきましょう。
KQLはMicrosoft Sentinelでも使う¶
KQLはLog Analyticsだけでなく、Microsoft Sentinelでセキュリティログを調査するときにも使います。
Azure上でセキュリティログを扱ってみたい方は、こちらの記事も参考にしてください。
【関連記事】Azure Sentinelでログを解析してみる|Linuxのログを収集する
KQLを覚えるなら実際のログを触ってみよう¶
KQLは暗記するより、実際のログで試す方が身につきます。テーブルを表示し、where、project、summarizeの順に試してみてください。
Azure自体の勉強方法から整理したい方は、こちらの記事も参考にしてください。
【関連記事】Azureの勉強方法を初心者向けに解説
KQLでログを読むには、HTTP、IPアドレス、Linuxなどの基礎知識も役立ちます。
InfraAcademyでは、Linuxやネットワーク、AWS、セキュリティなどを、実際に手を動かしながら学習できます。
ログに何が書かれているのかまで理解したい方は、Linuxやネットワークも一緒に学ぶのがおすすめです。
InfraAcademyでLinux・ネットワークを実践的に学ぶ
まずはLog Analyticsでテーブル名を1つ入力し、whereを1行追加するところから始めてみてください。






