Одно событие в журнале говорит о факте, а сотня одинаковых событий говорит о закономерности. Именно частота и распределение событий во времени раскрывают суть проблемы, недоступную при взгляде на отдельную запись. Служба падает раз в день в одно и то же время или хаотично? Ошибки диска нарастают или держатся ровным фоном? Какой источник засоряет журнал больше всех? Ответы на эти вопросы прячутся не в текстах событий, а в их количестве и ритме. Командная оболочка PowerShell умеет группировать события и считать их частоту, превращая груду записей в наглядную статистику. Этот анализ вскрывает то, что поиск отдельных событий показать не может, и всё нужное для него встроено в систему без сторонних программ.

Анализ частоты строится на группировке: события собирают в кучки по какому-то признаку и считают размер каждой кучки. Группировать можно по источнику, по коду события, по уровню важности, по часу возникновения. Размер группы и есть частота. Сравнивая частоты и их распределение во времени, выявляют закономерности: пики, нарастания, регулярные ритмы. Задача анализа - выбрать правильный признак группировки под вопрос, который надо прояснить, и прочитать получившуюся статистику.

Группировка событий по источнику для поиска главного нарушителя

Первый вопрос при разборе зашумлённого журнала - кто записывает больше всех. Группировка по источнику сразу выявляет главного поставщика событий. Подсчёт событий по источникам делается через группировку:

Get-WinEvent -FilterHashtable @{LogName='System'; Level=2,3} -MaxEvents 500 | Group-Object ProviderName | Sort-Object Count -Descending

Здесь берутся последние пятьсот ошибок и предупреждений, группируются по источнику и сортируются по числу от большего к меньшему. В выводе колонка количества показывает, сколько событий породил каждый источник, а сортировка ставит самого шумного наверх. Это сразу указывает на проблемный компонент: если одна служба дала сотни ошибок, а остальные единицы, ясно, с чего начинать разбор. Группировка по источнику - первый шаг анализа зашумлённого журнала, потому что она отделяет главного нарушителя от фонового шума и задаёт направление дальнейшему расследованию. Вместо вчитывания в каждую запись администратор сразу видит, какой источник требует внимания в первую очередь.

Подсчёт частоты по коду события для уточнения проблемы

Найдя шумный источник, уточняют, какие именно события он порождает, группируя их по коду. Один источник может выдавать разные коды, и их частоты различаются. Подсчёт событий источника по кодам делается так:

Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='Service Control Manager'} -MaxEvents 300 | Group-Object Id | Sort-Object Count -Descending

Здесь события одного источника группируются по коду и сортируются по частоте. Каждый код события означает определённый тип происшествия, и его частота показывает, что именно случается чаще всего. Преобладание одного кода указывает на конкретную повторяющуюся проблему, тогда как разброс по многим кодам говорит о разнородных сбоях. Это уточнение незаменимо после выявления шумного источника: оно переводит расплывчатое эта служба шумит в точное вот это конкретное событие повторяется сотню раз. Зная преобладающий код, ищут его расшифровку и причину, сужая разбор до одной конкретной проблемы вместо общего недовольства поведением источника.

Распределение событий по времени для поиска ритма

Самое ценное в анализе частоты - распределение событий во времени, потому что ритм выдаёт природу проблемы. Группировка по часу возникновения показывает, когда события случаются чаще. Подсчёт событий по часам делается через группировку по извлечённому из времени часу:

Get-WinEvent -FilterHashtable @{LogName='System'; Level=2} -MaxEvents 1000 | Group-Object { $_.TimeCreated.Hour } | Sort-Object Name

Здесь ошибки группируются по часу суток, в который они произошли, и сортируются по часу для наглядной картины распределения. Если большинство ошибок приходится на один и тот же час, налицо временная закономерность: вероятно, в это время запускается какой-то процесс, обслуживание или нагрузка, провоцирующая сбой. Ровное распределение по всем часам, напротив, говорит о случайных, не привязанных ко времени сбоях. Этот анализ отличает плановую причину от случайной: регулярный ритм выдаёт срабатывающий по расписанию процесс, а хаотичный разброс указывает на спонтанные аппаратные или программные сбои. Привязка ко времени часто оказывается ключом к разгадке, потому что она связывает события с тем, что происходит в системе в эти моменты. Чтобы превратить распределение по часам в наглядную картину, к подсчёту иногда добавляют простую текстовую гистограмму, где длина строки из символов отражает число событий в каждом часу. Такой самодельный график рисуется в выводе оболочки повторением символа столько раз, сколько событий в группе, и сразу показывает пики и провалы активности без всяких внешних программ построения диаграмм. Глядя на столбики разной длины, мгновенно видишь, в какие часы система лихорадит сильнее всего, что куда нагляднее голой колонки цифр и помогает уловить ритм буквально с первого взгляда.

Анализ динамики событий по дням за длительный период

Распределение по часам показывает ритм внутри суток, а группировка по дням раскрывает динамику за недели: нарастает проблема или затухает. Подсчёт событий по дням делается группировкой по дате:

Get-WinEvent -FilterHashtable @{LogName='System'; Level=2; StartTime=(Get-Date).AddDays(-30)} | Group-Object { $_.TimeCreated.Date } | Sort-Object Name

Здесь ошибки за месяц группируются по дате и сортируются по дням. Растущее день ото дня число ошибок выдаёт прогрессирующую проблему: умирающий диск, заполняющийся ресурс, накапливающийся сбой. Внезапный всплеск в конкретный день указывает на разовое событие: установку обновления, изменение конфигурации, аппаратный инцидент. Ровный фон без роста означает хроническую, но стабильную проблему, не ухудшающуюся со временем. Чтение этой динамики помогает расставить приоритеты: нарастающая проблема требует срочного вмешательства, пока не достигла критической точки, а стабильный фон можно разбирать в плановом порядке. Динамика по дням превращает журнал в график здоровья системы, по которому видно, куда движется ситуация.

Сравнение частоты по уровням важности для оценки здоровья

Прежде чем углубляться в конкретные коды, полезно оценить общее здоровье системы по соотношению событий разной важности. Группировка по уровню сразу показывает баланс ошибок, предупреждений и информационных записей. Подсчёт событий по уровням важности делается так:

Get-WinEvent -FilterHashtable @{LogName='System'; StartTime=(Get-Date).AddDays(-7)} | Group-Object LevelDisplayName | Sort-Object Count -Descending

Здесь все события за неделю группируются по уровню важности и сортируются по числу. В выводе видно, сколько было ошибок, сколько предупреждений и сколько обычных информационных записей. Здоровая система показывает преобладание информационных записей и редкие ошибки. Тревожный признак - большая доля ошибок и предупреждений в общем потоке, говорящая о нездоровье. Это соотношение служит грубым индикатором состояния: оно не указывает на конкретную проблему, но сразу отвечает, спокойна система или лихорадит. Сравнив такое соотношение с замером недельной давности, видят, ухудшается ли общее здоровье или держится стабильным. Этот верхнеуровневый срез задаёт тон всему дальнейшему анализу: если доля ошибок резко выросла против обычной, копают глубже по источникам и кодам, а если она в норме, серьёзных системных проблем, скорее всего, нет.

Вычисление средней частоты и выявление аномальных всплесков

Голое число событий полезно, но ещё полезнее знать, нормальна ли эта частота или аномальна. Для этого вычисляют среднюю частоту события за период и сравнивают с текущей. Подсчёт средней дневной частоты конкретного события делается через деление общего числа на количество дней:

$события = Get-WinEvent -FilterHashtable @{LogName='System'; ID=7000; StartTime=(Get-Date).AddDays(-30)}
$всего = $события.Count
$средняяВДень = [math]::Round($всего / 30, 1)
Write-Host "Событие 7000: всего $всего за месяц, в среднем $средняяВДень в день"

Скрипт считает общее число событий за месяц и делит на тридцать дней, получая среднюю дневную частоту. Зная среднюю, легко заметить аномалию: если обычно событие случается дважды в день, а сегодня их пятьдесят, это резкий всплеск, требующий внимания. Средняя частота превращает сырое число в осмысленный ориентир, относительно которого оценивают текущую активность. Без такого ориентира любое число событий висит в воздухе: пятьдесят ошибок за день - это много или мало? Ответ зависит от того, сколько их бывает обычно. Сравнение текущей частоты со средней за период отделяет рядовой фон от настоящей аномалии, и именно аномальные отклонения от привычной нормы заслуживают первоочередного разбора, тогда как стабильный фоновый уровень событий чаще всего безобиден и не требует срочной реакции.

Сведение статистики в наглядную таблицу и итоги

Полноценный анализ сводит несколько срезов воедино, давая объёмную картину. Помимо подсчёта числа событий, полезно знать временные границы каждой группы: когда событие данного типа появилось впервые и в последний раз. Сводка по кодам с временными границами делается так:

Get-WinEvent -FilterHashtable @{LogName='System'; Level=2} -MaxEvents 1000 | Group-Object Id | ForEach-Object {
    [PSCustomObject]@{
        Код = $_.Name
        Количество = $_.Count
        Первое = ($_.Group | Sort-Object TimeCreated | Select-Object -First 1).TimeCreated
        Последнее = ($_.Group | Sort-Object TimeCreated | Select-Object -Last 1).TimeCreated
    }
} | Sort-Object Количество -Descending

Этот скрипт по каждому коду события показывает его частоту и временные границы появления. Такая сводка отвечает сразу на несколько вопросов: что случается чаще всего, когда это началось и продолжается ли до сих пор. Код с высокой частотой и свежим последним появлением - это активная проблема, требующая внимания, а код, последнее появление которого было давно, - это уже решённый или прекратившийся сбой.

Такую сводку удобно сохранять и сравнивать во времени. Сняв её сегодня и сравнив с такой же недельной давности, видят, какие коды участились, какие затихли, какие появились впервые. Это превращает разовый анализ в наблюдение за динамикой, где важны не только текущие цифры, но и их изменение. Появление нового кода с высокой частотой - сигнал свежей проблемы, начавшейся недавно. Резкий рост частоты знакомого кода - признак обострения. Регулярное снятие таких сводок и их сравнение между собой и есть основа упреждающего анализа журналов, при котором проблему замечают по нарастанию частоты задолго до того, как она перерастёт в явный сбой.

Анализ частоты событий вскрывает закономерности, невидимые при поиске отдельных записей. Группировка по источнику находит главного нарушителя в зашумлённом журнале. Подсчёт по кодам уточняет, какое именно событие преобладает. Распределение по часам выявляет суточный ритм, отличая плановые причины от случайных. Динамика по дням показывает, нарастает проблема или затухает. Сводка с временными границами отделяет активные проблемы от прекратившихся. Вместе эти срезы превращают журнал из набора разрозненных записей в источник статистики о здоровье системы. Главная мысль проста: единичное событие - это точка, а частота и ритм событий - это линия, рисующая поведение системы во времени. Освоив группировку и подсчёт, администратор читает эту линию и понимает не только что случилось, но и как часто, когда и куда движется ситуация, а это знание стоит куда дороже разбора отдельных записей, потому что именно закономерности, а не единичные факты, указывают на истинные корни проблем и позволяют предсказывать их развитие.