Начало работы с запросами журналов Azure Monitor
Примечание
Вы можете выполнить это упражнение в своей среде, если собираете данные хотя бы с одной виртуальной машины. Если нет, используйте нашу демонстрационную среду, которая содержит большое количество образцов данных.
Если вы уже знаете, как выполнять запросы в язык запросов Kusto (KQL), но вам нужно быстро создавать полезные запросы на основе типов ресурсов, см. область сохраненных примеров запросов в статье Использование запросов в Azure Monitor Log Analytics.
В этом руководстве рассматривается написание запросов журналов в Azure Monitor. В этой статье описаны следующие операции:
- понимать структуру запросов;
- сортировать результаты запроса;
- фильтровать результаты запроса;
- указывать диапазон времени;
- выбирать поля для включения в результаты;
- определять и использовать настраиваемые поля;
- вычислять и группировать результаты.
Руководство по использованию Log Analytics на портале Azure см. в разделе Начало работы со службой Log Analytics в Azure Monitor.
Дополнительные сведения о запросах журналов в Azure Monitor см. в разделе Общие сведения о запросах журналов в Azure Monitor.
Просмотрите видеоверсию этого учебника:
Написание запроса
Запросы могут начинаться с имени таблицы или search
команды . Рекомендуется начинать с имени таблицы, так как оно определяет четкую область для запроса. Это также повышает производительность запросов и релевантность результатов.
Примечание
KQL, который используется Azure Monitor, учитывает регистр. Ключевые слова языка обычно записываются в нижнем регистре. При использовании имен таблиц или столбцов в запросе обязательно используйте правильный регистр, как показано в области схемы.
Запросы на основе таблиц
Azure Monitor упорядочивает данные журнала в таблицы, каждая из которых состоит из нескольких столбцов. На портале Analytics в области схемы в Log Analytics отображаются все таблицы и столбцы. Определите интересующую вас таблицу, а затем взгляните на часть данных:
SecurityEvent
| take 10
Предыдущий запрос возвращает 10 результатов из таблицы без определенного SecurityEvent
порядка. Этот распространенный способ взглянуть на таблицу помогает понять ее структуру и содержимое. Давайте рассмотрим структуру запроса:
- Запрос начинается с имени
SecurityEvent
таблицы , которая определяет область запроса. - Символ вертикальной черты ("|") разделяет команды, поэтому выходные данные первой команды содержатся во входных данных следующей. Можно добавить любое число элементов, разделенных этой чертой.
- После канала находится
take
команда , которая возвращает определенное количество произвольных записей из таблицы.
Запрос можно выполнить даже без добавления | take 10
. Команда будет допустимой, но может вернуть до 10 000 результатов.
Поисковые запросы
Поисковые запросы менее структурированы. Они лучше подходят для поиска записей, которые содержат определенное значение в любом из столбцов:
search in (SecurityEvent) "Cryptographic"
| take 10
Этот запрос выполняет поиск в SecurityEvent
таблице записей, содержащих фразу "Cryptographic". Из них будут возвращены и отображены 10 записей. Если опустить in (SecurityEvent)
часть и запустить только search "Cryptographic"
, поиск будет выполняться по всем таблицам. Затем процесс займет больше времени и будет менее эффективным.
Важно!
Поисковые запросы обычно выполняются медленнее, чем запросы на основе таблиц, поскольку они обрабатывают больше данных.
Операторы sort и top
Хотя take
это удобно для получения нескольких записей, результаты выбираются и отображаются не в определенном порядке. Чтобы получить упорядоченное представление, можно sort
использовать предпочтительный столбец:
SecurityEvent
| sort by TimeGenerated desc
Предыдущий запрос может возвращать слишком много результатов, и это также может занять некоторое время. Запрос сортирует всю SecurityEvent
таблицу по столбцу TimeGenerated
. Портал аналитики ограничивает отображение для вывода только 10 000 записей. Этот подход не является оптимальным.
Лучший способ получить только последние 10 записей — использовать top
, который сортирует всю таблицу на стороне сервера, а затем возвращает первые записи:
SecurityEvent
| top 10 by TimeGenerated
Порядок сортировки по убыванию — это порядок сортировки по умолчанию, поэтому аргумент обычно опускается desc
. Выходные данные выглядят, как в этом примере.
Оператор where: Filter on a condition
Фильтры, как очевидно из названия, фильтруют данные по указанному условию. Фильтрация — это наиболее распространенный способ ограничить результаты запроса релевантными сведениями.
Чтобы добавить фильтр в запрос, используйте where
оператор , за которым следует одно или несколько условий. Например, следующий запрос возвращает только SecurityEvent
записи, в которых Level equals _8
:
SecurityEvent
| where Level == 8
При написании условий фильтра вы можете использовать следующие выражения.
Выражение | Описание | Пример |
---|---|---|
== | Проверка на равенство (с учетом регистра) |
Level == 8 |
=~ | Проверка на равенство (без учета регистра) |
EventSourceName =~ "microsoft-windows-security-auditing" |
!=, <> | Проверка на неравенство (оба выражения идентичны) |
Level != 4 |
and , or |
Требуется между условиями | Level == 16 or CommandLine != "" |
Для фильтрации по нескольким условиям можно использовать любой из следующих подходов.
Используйте and
, как показано ниже:
SecurityEvent
| where Level == 8 and EventID == 4672
По конвейеру несколько where
элементов, один за другим, как показано ниже:
SecurityEvent
| where Level == 8
| where EventID == 4672
Примечание
Значения могут иметь разные типы, поэтому может потребоваться привести их в правильный тип для выполнения сравнения. Например, SecurityEvent Level
столбец имеет тип String, поэтому его необходимо привести к числовым типам, таким как int
или long
, прежде чем использовать в нем числовые операторы, как показано ниже: SecurityEvent | where toint(Level) >= 10
указывать диапазон времени;
Диапазон времени можно указать с помощью средства выбора времени или фильтра времени.
Использование элемента выбора времени
Средство выбора времени отображается рядом с кнопкой Выполнить и указывает, что вы запрашиваете записи только за последние 24 часа. Этот диапазон времени по умолчанию применяется ко всем запросам. Чтобы получить записи только за последний час, выберите Последний час и выполните запрос еще раз.
Добавление фильтра времени в запрос
Вы также можете определить ваш собственный диапазон времени, добавив фильтр времени к запросу. Лучше разместить фильтр времени сразу после имени таблицы:
SecurityEvent
| where TimeGenerated > ago(30m)
| where toint(Level) >= 10
В предыдущем фильтре ago(30m)
времени означает "30 минут назад". Этот запрос возвращает записи только за последние 30 минут, которые выражаются, например, 30 мин. Можно использовать и другие единицы времени, например дни (2d) и секунды (10s).
Использование операторов project и extend для выбора и вычисления столбцов
Используйте project
для выбора определенных столбцов для включения в результаты:
SecurityEvent
| top 10 by TimeGenerated
| project TimeGenerated, Computer, Activity
Приведенный выше пример формирует следующие выходные данные:
Вы также можете использовать для project
переименования столбцов и определения новых. В следующем примере используется project
для выполнения следующих действий:
- Выберите только исходные
Computer
столбцы иTimeGenerated
. - Отображение столбца в
Activity
видеEventDetails
. - Создайте столбец с именем
EventCode
. Функцияsubstring()
используется для получения из поля только первых четырех символовActivity
.
SecurityEvent
| top 10 by TimeGenerated
| project Computer, TimeGenerated, EventDetails=Activity, EventCode=substring(Activity, 0, 4)
Можно использовать для extend
сохранения всех исходных столбцов в результирующем наборе и определения других столбцов. Следующий запрос использует для extend
добавления столбца EventCode
. Этот столбец может не отображаться в конце результатов таблицы. Чтобы просмотреть ее, необходимо развернуть сведения о записи.
SecurityEvent
| top 10 by TimeGenerated
| extend EventCode=substring(Activity, 0, 4)
Использование оператора summarize для агрегирования групп строк
Используйте для summarize
идентификации групп записей по одному или нескольким столбцам и применения к ним агрегатов. Чаще всего используется summarize
count
, который возвращает количество результатов в каждой группе.
Следующий запрос проверяет все Perf
записи за последний час, группирует их по ObjectName
и подсчитывает записи в каждой группе:
Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName
Иногда имеет смысл определить группы по нескольким измерениям. Каждое уникальное сочетание этих значений определяет отдельную группу:
Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName, CounterName
Другое распространенное использование — выполнять математические или статистические вычисления в каждой группе. В следующем примере вычисляется среднее значение CounterValue
для каждого компьютера:
Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer
К сожалению, результаты этого запроса не имеют смысла, так как мы смешивали разные счетчики производительности. Чтобы сделать результаты более значимыми, вычислите среднее значение отдельно для каждого сочетания CounterName
и Computer
:
Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer, CounterName
Суммирование по столбцу времени
Результаты группирования также могут основываться на столбце времени или другом непрерывном значении. Простое суммирование by TimeGenerated
, однако, приведет к созданию групп для каждой миллисекунды в диапазоне времени, так как эти значения уникальны.
Чтобы создать группы на основе непрерывных значений, лучше разбить диапазон на управляемые единицы с помощью bin
. Следующий запрос анализирует Perf
записи, измеряющие свободную память (Available MBytes
) на определенном компьютере. Он рассчитывает среднее значение каждого периода в 1 час за последние 7 дней:
Perf
| where TimeGenerated > ago(7d)
| where Computer == "ContosoAzADDS2"
| where CounterName == "Available MBytes"
| summarize avg(CounterValue) by bin(TimeGenerated, 1h)
Чтобы сделать выходные данные более четкими, можно выбрать отображение их в виде временной диаграммы, на которой отображается доступная память с течением времени.
Дальнейшие действия
- Дополнительные сведения об использовании строкового типа данных в запросе журнала см. в статье Работа со строками в запросах журнала Azure Monitor.
- Дополнительные сведения об агрегировании данных в запросе журнала см. в статье Расширенное агрегирование в запросах журнала Azure Monitor.
- Дополнительные сведения об объединении данных из нескольких таблиц см. в статье Объединения в запросах журнала Azure Monitor.
- Получите документацию по всему язык запросов Kusto в справочнике по языку KQL.