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

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

Экспорт в таблицу для анализа в редакторе

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

Get-WinEvent -FilterHashtable @{LogName='System'; Level=2; StartTime=(Get-Date).AddDays(-1)} |
    Select-Object TimeCreated, Id, ProviderName, LevelDisplayName, Message |
    Export-Csv C:\sobytiya.csv -NoTypeInformation -Encoding UTF8

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

Сохранение в простой текст для беглого чтения и передачи

Когда нужно просто прочитать события или вложить их в письмо, подходит обычный текстовый файл. Он не структурирован для анализа, зато читается где угодно. Выгрузка событий в текст делается через перенаправление форматированного вывода:

Get-WinEvent -FilterHashtable @{LogName='System'; Level=2; StartTime=(Get-Date).AddDays(-1)} |
    Format-List TimeCreated, Id, ProviderName, Message |
    Out-File C:\sobytiya.txt -Encoding UTF8

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

Выгрузка в структурированный формат для машинного анализа

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

Get-WinEvent -FilterHashtable @{LogName='System'; Level=2; StartTime=(Get-Date).AddDays(-1)} |
    Select-Object TimeCreated, Id, ProviderName, LevelDisplayName, Message |
    ConvertTo-Json | Out-File C:\sobytiya.json -Encoding UTF8

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

Экспорт в родной формат журнала для архива и переноса

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

wevtutil epl System C:\system-arhiv.evtx

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

Подготовка данных перед экспортом для удобства анализа

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

Get-WinEvent -FilterHashtable @{LogName='System'; Level=2; StartTime=(Get-Date).AddDays(-7)} |
    Select-Object @{N='Время';E={$_.TimeCreated.ToString('yyyy-MM-dd HH:mm:ss')}}, @{N='Код';E={$_.Id}}, @{N='Источник';E={$_.ProviderName}}, @{N='Описание';E={$_.Message -replace "`r`n"," "}} |
    Export-Csv C:\podgotovlennye.csv -NoTypeInformation -Encoding UTF8

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

Объединение событий из нескольких журналов в одну выгрузку

Часто полная картина проблемы складывается из событий разных журналов: системного, журнала приложений, профильных журналов служб. Анализировать их по отдельности неудобно, поэтому перед экспортом события из разных журналов сводят в единую выборку, упорядоченную по времени. Объединение событий двух журналов в одну выгрузку делается так:

$сис = Get-WinEvent -FilterHashtable @{LogName='System'; Level=2; StartTime=(Get-Date).AddDays(-1)}
$прил = Get-WinEvent -FilterHashtable @{LogName='Application'; Level=2; StartTime=(Get-Date).AddDays(-1)}
$все = $сис + $прил | Sort-Object TimeCreated
$все | Select-Object TimeCreated, LogName, Id, ProviderName, Message | Export-Csv C:\obyedinyonnye.csv -NoTypeInformation -Encoding UTF8

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

Решение проблем кодировки и объёма при экспорте

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

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

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