Azure
ログ
AzureLogAnalytics
LogAnalytics
SIEM

Azure Log Analytics - 良く使われるオペレーターの使い方(クエリ言語)


Azure Log Analyticsとは?

Azure Log Analtyicsとは、Azure上でログの保管や分析ができるSaaS型のログ管理ソリューションです。オンプレミス環境やクラウド環境のWindows Server/Clientのイベントログ・パフォーマンスカウンターやLinuxサーバーのSyslog・パフォーマンスカウンターのデータを一括して収集してAzure上のデータベースに保存し、それをクエリ言語(Kusto Query Language)を使って分析することができます。また、Azureの各サービスのログをまとめて格納し、ログ管理を行うこともできます。Log Analyticsは、他のAzureのサービス(Security Center, Azure Automationなど)の基盤としても利用されています。

(公式)Log Analytics - クラウドのIT分析ツール

https://azure.microsoft.com/ja-jp/services/log-analytics/

(公式)Azure Log Analyticsとは?(公式ドキュメント)

https://docs.microsoft.com/ja-jp/azure/log-analytics/log-analytics-overview


Log Analyticsのクエリ言語 - Kusto Query Languageとは?

Log Analyticsのクエリ言語(Kusto Query Language, KQL)は、クエリをシンプルに書くことができる、AzureのサービスではLog AnalyticsやApplication Insightで利用可能な言語です。高速に検索できるよう基盤が整えられています。


クエリ言語のリファレンス

(公式) Azure Log Analytics Query Language

https://docs.loganalytics.io/index

: 英語版しかありませんが、KQLのチュートリアルや言語リファレンスがまとめられています。サンプルクエリも多く用意されています。

image.png


Free Course - 無料の学習コース

Pluralsight "Kusto Query Language (KQL) from Scratch"

https://aka.ms/KQLPluralsight

: こちらも英語ですが、テクノロジー学習用サイトPluralsightに無料登録すると、イントロダクションから高度なオペレーターの利用方法まで、一通り学べるコースが用意されています。(もちろん無料です!)

image.png


デモサイト

LA Demo

https://aka.ms/LADemo

: 上記の無料コースでも紹介された、すでにログが収集され、実際にクエリをたたくことができるだれでも利用可能なデモ環境です。リンク先がLog Analyticsの分析ポータルになっており、すぐに分析が可能です。

image.png


よく使われるオペレーターの使い方

本稿では、上記Pluralsigntのコースでも "80% of the Operators You'll Ever Use" として紹介されている、Log Analyticsでよく使われるオペレーターを使っていきたいと思います。


*環境設定

本稿のメインではないので、詳細は省きますが、Log Analyticsではエージェントを各サーバーに入れ、エージェントからAzure上で指定したイベントログ、パフォーマンスカウンター、Syslogを持ってくる仕組みです。詳細は以下など、公式のチュートリアルをご覧ください。

(公式)環境内でホストされている Windows コンピューターからデータを収集する

https://docs.microsoft.com/ja-jp/azure/log-analytics/log-analytics-quick-collect-windows-computer

(公式)環境内でホストされている Linux コンピューターからデータを収集する

https://docs.microsoft.com/ja-jp/azure/log-analytics/log-analytics-quick-collect-linux-computer

以下から、各オペレーターを見ていきます。下記のクエリの例は、先のデモ環境で実際に実行することができます。


search - 特定の文字列を検索するオペレーター

文法:特定のキーワードを含むレコードを抜き出す

search <keyword>

例:Perfテーブル(パフォーマンスカウンター)から"memory"という単語が入っているレコードを取り出す

Perf | search "memory"

または

search in (Perf) "memory"

正規表現もサポートしており、例えば以下のようなクエリを書くこともできます。

例:Perfテーブル(パフォーマンスカウンター)から"*bytes"という単語が入っているレコードを取り出す

Perf | search "*bytes"


where - 条件を加えていくオペレーター

文法:特定の条件を満たすレコードを抜き出す。

| where <条件>

例:パフォーマンスカウンターテーブルから、1時間以内のログを抜き出す。

Perf | where TimeGenerated > ago(1h)

・TimeGenerated:ログの生成時間

・ago(<時間;1m(1分)、1h(1時間)、1d(1日)など>):現在時刻から<時間>前、上記のように使われます。

例:上の例を満たし、更にカウンター名が"Bytes Received/sec"で、さらにその値が0より大きいレコードだけ取り出す。

Perf | where TimeGenerated > ago(1h) and CounterName == "Bytes Received/sec" and CounterValue > 0


take - テーブルからのN個のレコードを取ってくるオペレーター

文法:N個だけレコードを取ってくる

take <N>

例:パフォーマンスカウンターテーブルから10レコードだけ取ってくる

Perf | take 10

*注意点:takeではどのレコードが取られるかは保証されません。


count - レコードの数を数えるオペレーター

文法:レコードを数える

count

例:パフォーマンスカウンターテーブルのレコード数を数える

Perf | count

・countはアラートを上げる時によく利用されます(例、特定の単語を含むログが1個以上出てきたら、アラートを出すなど)。


summarize

summarizeは、アグリゲーションを行う、重要なオペレーターです。

文法:アグリゲーション関数、条件の沿って集約を行う

summarize [新しいフィールド名 =] <アグリゲーション関数> by <条件>

例:パフォーマンスカウンターごとのレコードの数を集計する

Perf | summarize count() by CounterName

例:1日あたりのレコードの数を、レコード名NumberOfEntriesとして集計する

Perf | summarize NumberOfEntries=count by bin(TimeGenerated, 1d)


bin - 丸め込みを行うオペレーター(よくsummarizeと一緒に利用される)

文法:特定の単位にまとめる

bin(ターゲットの値、丸め込みの単位)

例:数字を丸め込む

bin(4.5, 1) 

--> 4.0

例:日にちを丸め込む

bin(datetime(1970-05-11 13:45:07), 1d)

--> datetime(1970-05-11)


summarizeで使われるアグリゲーション関数

count()の他にも多くのアグリゲーション関数が用意されています。

image.png


extend - 新しいフィールドを作成するオペレーター

文法:新しいフィールドを追加する

extend <新しいフィールド名> = 計算式

例:パフォーマンスカウンター Free Megabytes を使って、GB単位のフィールドを作成する

Perf | where CounterName == "Free Megabytes" | extend FreeGB = CounterValue/1000


project - 表示するフィールドを選択するオペレーター

文法:表示するフィールドを指定

project <フィールド名>

例:パフォーマンスカウンターテーブルから、ObjectName, CounterName, InstanceName, CounterValue, TimeGeneratedのみを表示

Perf | project ObjectName, CounterName, InstanceName, CounterValue, TimeGenerated


project-away - 表示しないフィールドを指定

文法:表示しないフィールドを指定

project-away <フィールド名>

例:tenantIDをテーブルで表示しないようにする

Perf | project-away tenantID


project-rename - 表示するフィールド名を変える

文法:もともとのフィールド名を新しいフィールド名に変える

project-rename <新しいフィールド名> = <古いフィールド名>

例:"Computer"フィールドを、"myRenamedName" フィールドに変更する

Perf | project-rename myRenamedName = Computer


distinct - 重複排除し、特定の組み合わせ表を作成するオペレーター

文法:あるフィールドに関して重複排除した表(複数の場合は組み合わせ表)を表示する

distinct <フィールド1>, <フィールド2>, ‥

ぱっと見分かりにくいかもしれないですが、以下の例で考えると分かりやすいです。

例:イベントログのテーブルで、EventLevelNameがErrorなものを抜き出した表から、Sourceに関して重複排除した表を作り出す

Event | where EventLevelName == "Error" | distinct Source


top - 上位N個のレコードを抜きだすオペレーター

文法:あるフィールドの値で上位N個を抜き出す

top N by <フィールド>  [asc | desc] [nulls first | nulls last]

例:パフォーマンスカウンターの中で、生成時間が最も最近のものから降順で25個取り出す

Perf | top 25 by TimeGenerated desc


最後に

詳細は以下のリファレンスで各オペレーターの説明をご参照ください。

https://docs.loganalytics.io/docs/Language-Reference/Change-log

*本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。