Начало работы с запросами журналов 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 . Выходные данные выглядят, как в этом примере.

Снимок экрана: первые 10 записей, отсортированных по убыванию.

Оператор 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 переименования столбцов и определения новых. В следующем примере используется 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 идентификации групп записей по одному или нескольким столбцам и применения к ним агрегатов. Чаще всего используется summarizecount, который возвращает количество результатов в каждой группе.

Следующий запрос проверяет все 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)

Чтобы сделать выходные данные более четкими, можно выбрать отображение их в виде временной диаграммы, на которой отображается доступная память с течением времени.

Снимок экрана: значения памяти запроса с течением времени.

Дальнейшие действия