InfraAcademy

InfraAcademy Blog

【Azure】KQLの使い方は?LogAnalyticsでログを表示する

| #Microsoft Azure #KQL
Linuxをブラウザで試してみる

Linux・ネットワーク・AWSを、環境構築なしで実践学習できます

こんにちは、インフラエンジニアの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 指定した件数だけ表示する

まずはwhereprojectsummarizeを使えれば十分です。

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モードで実際にクエリを書いてみましょう。

KQLの使い方解説

画像は以前のLog Analytics画面なので、現在のAzure Portalとは配置やデザインが異なる場合があります。ただ、クエリを入力してログを確認するという基本的な使い方は同じです。

まずはテーブルのログを表示する

元の記事では最初に次のクエリを使っていました。

search "*"

このクエリでもログを探せますが、ワークスペース内の多くのテーブルを検索するため、現在はどのテーブルを見たいか分かっている場合は、テーブル名から始める方がおすすめです。

App ServiceのHTTPアクセスログであれば、次のようにします。

AppServiceHTTPLogs

これだけでもログを表示できます。

ログが多すぎる場合は、まず10件だけ表示してみましょう。

AppServiceHTTPLogs
| take 10

検索する時間を確認する

Log Analyticsでは、クエリだけでなく画面上の時間範囲も重要です。

KQLコマンド実行

たとえば、昨日発生したエラーを探しているのに、検索範囲が直近1時間になっていればログは表示されません。

ログが見つからないときは、時間範囲も確認するのがポイントです。

ログの表示

whereで必要なログだけ絞り込む

KQLで一番よく使うのがwhereです。

whereを使うと、指定した条件に一致するログだけを表示できます。

たとえばApp ServiceへのGETリクエストだけを見たい場合は、次のようにします。

AppServiceHTTPLogs
| where CsMethod == "GET"

AppServiceHTTPLogsには、HTTPメソッドを表すCsMethodという列があります。

KQLでログの詳細を表示する

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

whereコマンドを使う

たとえば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

distinctコマンドを実行

アクセス元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を条件にして遅いリクエストだけを抽出することもできます。

KQLを調べると、次のクエリを見かけることがあります。

search "*"

何のテーブルにログがあるか分からないときは便利ですが、多くのテーブルや列を検索するため処理対象が増えます。

テーブルや列が分かっているなら、次のように対象を明確にする方が効率的です。

AppServiceHTTPLogs
| where ScStatus >= 500

基本は、テーブル名を書く → whereで絞ると覚えておきましょう。

KQLはMicrosoft Sentinelでも使う

KQLはLog Analyticsだけでなく、Microsoft Sentinelでセキュリティログを調査するときにも使います。

Azure上でセキュリティログを扱ってみたい方は、こちらの記事も参考にしてください。

【関連記事】Azure Sentinelでログを解析してみる|Linuxのログを収集する

KQLを覚えるなら実際のログを触ってみよう

KQLは暗記するより、実際のログで試す方が身につきます。テーブルを表示し、whereprojectsummarizeの順に試してみてください。

Azure自体の勉強方法から整理したい方は、こちらの記事も参考にしてください。

【関連記事】Azureの勉強方法を初心者向けに解説

KQLでログを読むには、HTTP、IPアドレス、Linuxなどの基礎知識も役立ちます。

InfraAcademyでは、Linuxやネットワーク、AWS、セキュリティなどを、実際に手を動かしながら学習できます。

ログに何が書かれているのかまで理解したい方は、Linuxやネットワークも一緒に学ぶのがおすすめです。

InfraAcademyでLinux・ネットワークを実践的に学ぶ

まずはLog Analyticsでテーブル名を1つ入力し、whereを1行追加するところから始めてみてください。

Next Action

記事で読んだ内容を、講座で実装してみましょう

InfraAcademyでは、ブラウザ上でLinuxやネットワークの実践環境を使いながら学習できます。無料で始められる講座から、学習の流れを試せます。

この記事を書いた人

ryu

InfraAcademy運営 / エンジニア

エンジニア歴10年。Linux、ネットワーク、クラウドを中心に、実務で役立つインフラ技術を初心者にもわかりやすく解説しています。

X: @ryu63614894

Related

関連記事

ブログ一覧へ

Roadmap

まずはこの4講座から

ログインすれば無料で始められる講座です。気になったテーマから手を動かして学べます。

講座一覧を見る