Azure Monitor でログ クエリの使用を開始するGet started with log queries in Azure Monitor

注意

少なくとも 1 つの仮想マシンからデータを収集する場合は、独自の環境でこの演習を行うことができます。You can work through this exercise in your own environment if you are collecting data from at least one virtual machine. それ以外の場合は、サンプル データが多数含まれている Microsoft のデモ環境を使用してください。If not then use our Demo environment, which includes plenty of sample data.

このチュートリアルでは、Azure Monitor でログ クエリを記述する方法について説明します。In this tutorial you will learn to write log queries in Azure Monitor. 以下の方法について説明します。It will teach you how to:

  • クエリの構造の概要Understand query structure
  • クエリ結果を並べ替えるSort query results
  • クエリ結果をフィルター処理するFilter query results
  • 時間の範囲を指定するSpecify a time range
  • 結果に含めるフィールドを選択するSelect which fields to include in the results
  • カスタム フィールドの定義と使用Define and use custom fields
  • 結果の集計とグループ化Aggregate and group results

Azure portal での Log Analytics の使用に関するチュートリアルについては、Azure Monitor Log Analytics の使用開始に関するページを参照してください。For a tutorial on using Log Analytics in the Azure portal, see Get started with Azure Monitor Log Analytics.
Azure Monitor でのログ クエリの詳細については、Azure Monitor でのログ クエリの概要に関するページを参照してください。For more details on log queries in Azure Monitor, see Overview of log queries in Azure Monitor.

このチュートリアルのビデオバージョンで学ぶには、以下を参照してください。Follow along with a video version of this tutorial below:

新しいクエリの記述Writing a new query

クエリは、テーブル名または search コマンドから始めることができます。Queries can start with either a table name or the search command. まずテーブル名から始めます。これは、テーブル名でクエリの明確な範囲が定義され、クエリのパフォーマンスと結果の関連性の両方が向上するためです。You should start with a table name, since it defines a clear scope for the query and improves both query performance and relevance of the results.

注意

Azure Monitor によって使用される Kusto クエリ言語では、大文字と小文字が区別されます。The Kusto query language used by Azure Monitor is case-sensitive. 通常、言語のキーワードは小文字で記述されます。Language keywords are typically written in lower-case. クエリ内でテーブルまたは列の名前を使用する場合は、スキーマ ウィンドウの表示に従って大文字と小文字を正しく指定します。When using names of tables or columns in a query, make sure to use the correct case, as shown on the schema pane.

テーブルベースのクエリTable-based queries

Azure Monitor では、ログ データはテーブルに編成され、各テーブルは複数の列で構成されます。Azure Monitor organizes log data in tables, each composed of multiple columns. Analytics ポータルでは、すべてのテーブルと列は Log Analytics のスキーマ ウィンドウに表示されます。All tables and columns are shown on the schema pane in Log Analytics in the Analytics portal. 目的のテーブルを指定子、データの一部を見てみます。Identify a table that you're interested in and then take a look at a bit of data:

SecurityEvent
| take 10

上記のクエリは、順不同で SecurityEvent から 10 個の結果を返します。The query shown above returns 10 results from the SecurityEvent table, in no specific order. これは、テーブルの概要を把握し、その構造と内容を理解する場合に非常に一般的な方法です。This is a very common way to take a glance at a table and understand its structure and content. それでは、どのように構築されているかを見てみましょう。Let's examine how it's built:

  • クエリはテーブル名 SecurityEvent で始まります。この部分で、クエリの範囲を定義します。The query starts with the table name SecurityEvent - this part defines the scope of the query.
  • 複数のコマンドは、パイプ (|) 文字で区切ります。そのため、最初のコマンドの出力は次のコマンドの入力になります。The pipe (|) character separates commands, so the output of the first one in the input of the following command. パイプでつないだ要素は、任意の数を追加できます。You can add any number of piped elements.
  • パイプの後には take コマンドがあります。このコマンドは、テーブルから特定の数の任意のレコードを返します。Following the pipe is the take command, which returns a specific number of arbitrary records from the table.

実際は | take 10 を追加しなくてもクエリを実行できます。この方法は有効ですが、最大 10,000 件の結果が返される可能性があります。We could actually run the query even without adding | take 10 - that would still be valid, but it could return up to 10,000 results.

検索クエリSearch queries

検索クエリはあまり構造化されていないため、一般的に、任意の列に特定の値が含まれるレコードを検索する場合に適しています。Search queries are less structured, and generally more suited for finding records that include a specific value in any of their columns:

search in (SecurityEvent) "Cryptographic"
| take 10

このクエリで、SecurityEvent テーブルの "Cryptographic" というフレーズが含まれるレコードが検索されます。This query searches the SecurityEvent table for records that contain the phrase "Cryptographic". このようなレコードの中から、10 個のレコードが返され、表示されます。Of those records, 10 records will be returned and displayed. in (SecurityEvent) の部分を省略して search "Cryptographic" を実行すると、すべてのテーブルに対して検索が実行されます。この処理には時間がかかり、効率が良くありません。If we omit the in (SecurityEvent) part and just run search "Cryptographic", the search will go over all tables, which would take longer and be less efficient.

警告

検索クエリは通常、処理する必要のあるデータが増えるため、テーブル ベースのクエリより低速です。Search queries are typically slower than table-based queries because they have to process more data.

sort と topSort and top

take は少数のレコードを取得する場合に便利ですが、結果は順不同で選択され、表示されます。While take is useful to get a few records, the results are selected and displayed in no particular order. 順序が設定されたビューを取得するには、優先する列で並べ替えます。To get an ordered view, you could sort by the preferred column:

SecurityEvent   
| sort by TimeGenerated desc

ただし、返される結果が多すぎる場合や、処理に時間もかかる場合があります。That could return too many results though and might also take some time. 上記のクエリで、SecurityEvent テーブル全体が TimeGenerated 列で並べ替えられます。The above query sorts the entire SecurityEvent table by the TimeGenerated column. Analytics ポータルでは、表示できるレコードの上限は 10,000 個に制限されています。The Analytics portal then limits the display to show only 10,000 records. Analytics ポータルでは、表示が 10,000 レコードに制限されます。This approach is of course not optimal.

最新の 10 レコードのみを取得するには、top を使用する方法が最適です。サーバー側でテーブル全体が並べ替えられてから、上位のレコードが返されます。The best way to get only the latest 10 records is to use top, which sorts the entire table on the server side and then returns the top records:

SecurityEvent
| top 10 by TimeGenerated

降順が既定の並べ替え順です。そのため、通常は desc の引数を省略します。出力は次のようになります。Descending is the default sorting order, so we typically omit the desc argument.The output will look like this:

top 10

where: 条件に基づいてフィルター処理するWhere: filtering on a condition

フィルターは、その名前のとおり、特定の条件に基づいてデータをフィルター処理します。Filters, as indicated by their name, filter the data by a specific condition. これは、クエリ結果を関連する情報に制限する最も一般的な方法です。This is the most common way to limit query results to relevant information.

クエリにフィルターを追加するには、where 演算子に続けて 1 つまたは複数の条件を使用します。To add a filter to a query, use the where operator followed by one or more conditions. たとえば、次のクエリは、Level8 に等しい SecurityEvent レコードのみを返します。For example, the following query returns only SecurityEvent records where Level equals 8:

SecurityEvent
| where Level == 8

フィルター条件を記述する場合は、次の式を使用できます。When writing filter conditions, you can use the following expressions:

Expression 説明Description Example
== 等価性をチェックしますCheck equality
(大文字と小文字を区別します)(case-sensitive)
Level == 8
=~ 等価性をチェックしますCheck equality
(大文字と小文字は区別されません)(case-insensitive)
EventSourceName =~ "microsoft-windows-security-auditing"
!=、<>!=, <> 非等価性をチェックしますCheck inequality
(両方の式は同じです)(both expressions are identical)
Level != 4
andorand, or 条件の間に必要ですRequired between conditions Level == 16 or CommandLine != ""

複数の条件でフィルター処理するには、and を使用します。To filter by multiple conditions, you can either use and:

SecurityEvent
| where Level == 8 and EventID == 4672

または、複数の where 要素をパイプでつなぎます。or pipe multiple where elements one after the other:

SecurityEvent
| where Level == 8 
| where EventID == 4672

注意

値の型は異なる可能性があるため、正しい型に基づいて比較を実行するために型をキャストする必要があります。Values can have different types, so you might need to cast them to perform comparison on the correct type. たとえば、SecurityEvent Level 列は String 型なので、数値演算子を使用する前に、int または long などの数値型にキャストする必要があります。SecurityEvent | where toint(Level) >= 10For example, SecurityEvent Level column is of type String, so you must cast it to a numerical type such as int or long, before you can use numerical operators on it: SecurityEvent | where toint(Level) >= 10

時間の範囲を指定するSpecify a time range

時刻の選択ツールTime picker

時刻の選択ツールは [実行] ボタンの横にあります。これは、過去 24 時間のレコードのみのクエリを実行していることを示しています。The time picker is next to the Run button and indicates we’re querying only records from the last 24 hours. これは、すべてのクエリに適用される既定の時間範囲です。This is the default time range applied to all queries. 過去 1 時間のレコードのみを取得するには、 [過去 1 時間] を選択してクエリを再度実行します。To get only records from the last hour, select Last hour and run the query again.

時刻の選択

クエリの時間フィルターTime filter in query

また、時間フィルターをクエリに追加して、独自の時間の範囲を定義することもできます。You can also define your own time range by adding a time filter to the query. テーブル名の直後に時間フィルターを配置することをお勧めします。It’s best to place the time filter immediately after the table name:

SecurityEvent
| where TimeGenerated > ago(30m) 
| where toint(Level) >= 10

上記の時間フィルター ago(30m) は "30 分前" を意味するので、このクエリで過去 30 分間のレコードのみが返されます。In the above time filter ago(30m) means "30 minutes ago" so this query only returns records from the last 30 minutes. 他の時間単位には、日 (2d)、分 (25m)、秒 (10s) があります。Other units of time include days (2d), minutes (25m), and seconds (10s).

プロジェクトと拡張: 列の選択と計算Project and Extend: select and compute columns

結果に含める特定の列を選択するには、project を使用します。Use project to select specific columns to include in the results:

SecurityEvent 
| top 10 by TimeGenerated 
| project TimeGenerated, Computer, Activity

前述の例では、次の出力が生成されます。The preceding example generates this output:

プロジェクトの結果をクエリする

また、project を使用して列の名前を変更し、新しい列を定義することもできます。You can also use project to rename columns and define new ones. 次の例では、project を使用して次の処理を行います。The following example uses project to do the following:

  • 元の列の Computer および TimeGenerated のみを選択します。Select only the Computer and TimeGenerated original columns.
  • Activity 列の名前を EventDetails に変更します。Rename the Activity column to EventDetails.
  • EventCode という名前の新しい列を作成します。Create a new column named EventCode. substring () 関数は、Activity フィールドの先頭の 4 文字のみを取得するために使用されます。The substring() function is used to get only the first four characters from the Activity field.
SecurityEvent
| top 10 by TimeGenerated 
| project Computer, TimeGenerated, EventDetails=Activity, EventCode=substring(Activity, 0, 4)

extend は、元の列をすべて結果セットに保存し、追加の列を定義します。extend keeps all original columns in the result set and defines additional ones. 次のクエリでは、extend を使用して、EventCode 列が追加されています。The following query uses extend to add the EventCode column. この列は、テーブル結果の最後に表示されない場合があることに注意してください。その場合、この列を表示するには、レコードの詳細を展開する必要があります。Note that this column may not display at the end of the table results in which case you would need to expand the details of a record to view it.

SecurityEvent
| top 10 by TimeGenerated
| extend EventCode=substring(Activity, 0, 4)

summarize: 行のグループを集計するSummarize: aggregate groups of rows

summarize を使用して、1 つまたは複数の列に従ってレコードのグループを特定し、それらのグループに集計を適用します。Use summarize to identify groups of records, according to one or more columns, and apply aggregations to them. summarize の最も一般的な用途は、各グループの結果の数を返す count です。The most common use of summarize is count, which returns the number of results in each group.

次のクエリでは、過去 1 時間のすべての Perf レコードを確認し、ObjectName でグループ化し、各グループのレコードをカウントします。The following query reviews all Perf records from the last hour, groups them by ObjectName, and counts the records in each group:

Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName

複数の次元でグループを定義することが理にかなっている場合があります。Sometimes it makes sense to define groups by multiple dimensions. これらの値の一意の組み合わせで、それぞれ別のグループが定義されます。Each unique combination of these values defines a separate group:

Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName, CounterName

もう 1 つの一般的な用途は、各グループに対して数学的または統計的計算を実行する場合です。Another common use is to perform mathematical or statistical calculations on each group. 以下の例では、各コンピューターの平均 CounterValue を計算します。For example, the following calculates the average CounterValue for each computer:

Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer

残念ながら、異なるパフォーマンス カウンターが混在するので、このクエリの結果は意味がありません。Unfortunately, the results of this query are meaningless since we mixed together different performance counters. より意味のある結果にするには、CounterNameComputer の組み合わせごとに別に平均を計算する必要があります。To make this more meaningful, we should calculate the average separately for each combination of CounterName and Computer:

Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer, CounterName

時間列で要約するSummarize by a time column

時間列または別の連続する値に基づいて結果をグループ化することもできます。Grouping results can also be based on a time column, or another continuous value. ただし、これらは一意の値なので、by TimeGenerated を要約するだけでは、時間の範囲全体に 1 ミリ秒ごとのグループが作成されます。Simply summarizing by TimeGenerated though would create groups for every single millisecond over the time range, since these are unique values.

連続する値に基づいてグループを作成するには、bin を使用して範囲を管理しやすい単位に分割することをお勧めします。To create groups based on continuous values, it is best to break the range into manageable units using bin. 次のクエリでは、特定のコンピューター上の空きメモリ ( [利用可能な MB] ) を測定する Perf レコードを分析します。The following query analyzes Perf records that measure free memory (Available MBytes) on a specific computer. 過去 7 日間の 1 時間ごとの平均値が計算されます。It calculates the average value of each 1 hour period over the last 7 days:

Perf 
| where TimeGenerated > ago(7d)
| where Computer == "ContosoAzADDS2" 
| where CounterName == "Available MBytes" 
| summarize avg(CounterValue) by bin(TimeGenerated, 1h)

出力をよりわかりやすくするには、時系列で空きメモリを示す時間グラフとして表示するように選択します。To make the output clearer, you select to display it as a time-chart, showing the available memory over time:

時系列でのメモリのクエリ

次のステップNext steps