- Вопрос или проблема
- Некоторая предыстория
- Как я могу создать ‘фильтрованный’ текстовый файл со всеми (релевантными) записями журнала за определенный период времени?
- Ответ или решение
- Понимание контекста
- Цели и задачи
- Как использовать Get-WinEvent
- Объяснение кода
- Улучшение видимости данных
- Рекомендации по отладке
- Заключение
Вопрос или проблема
Некоторая предыстория
Я сталкиваюсь с проблемами зависаний и сбоев, которые хочу лучше понять. Для этого мне нужно исследовать всю доступную информацию о событиях и журналах за определенный период времени.
Я очень хорошо знаю когда произошло что-то плохое, но не почему.
Например, я хотел бы получить всю потенциально релевантную информацию за определенный день в пределах 15 минут, скажем, с “26-11-2021 15:00” до “26-11-2021 15:15”.
Мне было трудно использовать встроенный просмотрщик событий Windows, чтобы получить доступ к этой информации, так как я не смог разобраться, как извлечь информацию из всех журналов в компактном виде.
Затем я узнал о PowerShell (запущенном от имени администратора) и инструменте Get-WinEvent. Однако я запутался в документации и не смог достичь своей основной цели:
Как я могу создать ‘фильтрованный’ текстовый файл со всеми (релевантными) записями журнала за определенный период времени?
После долгого поиска в интернете я нашел частичное решение своей проблемы, скопировав и вставив одну строку, которую нашел:
Get-WinEvent -ListLog * | % {Get-WinEvent -FilterHashTable @{LogName=$_.LogName;StartTime="26-11-2021 15:00";EndTime="26-11-2021 15:15"; Level=(1,2,3) } -ea 0} | sort timecreated -des >> C:\temp\events.txt
Это полезно, но не понимая синтаксиса, я заметил два недостатка:
-
Похоже, я не охватываю все записи. В частности, я знаю, что в определенный период произошел перезапуск системы, который должен появиться в Просмотрщике событий как критическое/ошибочное событие:
Но я не могу найти это в сгенерированном текстовом выводе за тот же период времени.
Поэтому это заставило меня подумать, что я все еще не нашел лучший способ достичь желаемого.
Буду признателен за любую помощь.
Я использовал передачу вывода в ‘Out-String’, а затем играл с шириной, чтобы получить желаемую видимость. Надеюсь, это поможет.
Ответ или решение
Использование инструмента Get-WinEvent
в PowerShell для извлечения всех записей событий за определённый период времени может показаться сложным на первый взгляд, но, следуя правильной методике, вы сможете получить нужную информацию. В этом ответе я подробно разберу, как эффективно использовать этот инструмент с учётом ваших требований.
Понимание контекста
Вы столкнулись с проблемами зависаний и сбоев, и хотите проанализировать события, произошедшие в определённый период времени — с 26 ноября 2021 года, 15:00 до 26 ноября 2021 года, 15:15. Использование встроенного средств просмотра событий Windows не дало вам нужных результатов, поэтому вы обратились к PowerShell и Get-WinEvent
.
Цели и задачи
Основная задача — извлечь все соответствующие записи событий за указанный промежуток времени и сохранить их в текстовом файле. При этом важно учитывать:
- Чтение событий из всех журналов;
- Извлечение полной информации, чтобы избежать обрезки данных;
- Учёт записей, относящихся к критическим ошибкам, включая системную перезагрузку.
Как использовать Get-WinEvent
Сначала убедитесь, что вы запустили PowerShell от имени администратора. Это обеспечит доступ к необходимым журналам событий. Вот пример кода, который поможет вам извлечь нужные записи:
$startTime = Get-Date "2021-11-26 15:00"
$endTime = Get-Date "2021-11-26 15:15"
$logNames = Get-WinEvent -ListLog * | Select-Object -ExpandProperty LogName
foreach ($logName in $logNames) {
Get-WinEvent -LogName $logName -FilterHashtable @{ StartTime = $startTime; EndTime = $endTime } -ErrorAction SilentlyContinue |
Select-Object TimeCreated, Id, LevelDisplayName, Message |
Format-Table -AutoSize |
Out-File -Append C:\temp\events.txt
}
Объяснение кода
- Переменные времени: Используются переменные для хранения времени начала и окончания, что упрощает их использование.
- Получение всех имен журналов: Вызывает команду
Get-WinEvent -ListLog *
для получения всех журналов событий в системе. - Цикл и фильтрация: Для каждого журнала событий выполняется
Get-WinEvent
с использованием хэш-таблицы фильтров, что позволяет ограничить выборку событиями, которые произошли в указанный период времени.-ErrorAction SilentlyContinue
предотвращает вывод сообщений об ошибках, если журнал пуст. - Форматирование вывода: Выводимые события форматируются для удобства просмотра и записываются в файл
events.txt
. Это предотвращает обрезку сообщений.
Улучшение видимости данных
Чтобы избежать обрезки текстовых данных, можно использовать настройки ширины вывода. Например, вы можете использовать Out-String -Width 250
, чтобы задать ширину строки. Это может выглядеть как:
| Out-String -Width 250 -Stream | Out-File -Append C:\temp\events.txt
Рекомендации по отладке
Если пропускаются критические события, убедитесь, что журнал, в котором они хранятся, действительно обрабатывается. Вы можете добавить фильтрацию по уровням критичности, чтобы увидеть только критические и ошибки:
$levels = 1, 2, 3 # Critical, Error, Warning
Заключение
Используя Get-WinEvent
, вы можете эффективно проанализировать события за заданный период и получить всю нужную информацию в формате, удобном для дальнейшей работы. Убедитесь, что вы экспериментируете с фильтрами и форматами, чтобы получать наиболее полные данные. Надеюсь, это поможет вам в расследовании проблем с системой. Если у вас появятся дополнительные вопросы, не стесняйтесь обращаться за поддержкой.