Как добавить источник журнала событий в Windows через PowerShell
Откройте Windows PowerShell от имени администратора и зарегистрируйте источник в журнале Application:
New-EventLog -LogName Application -Source "TestApi"
Теперь приложение или скрипт может писать события с источником TestApi. Окно нужно открыть от имени администратора: чтобы проверить, что имя уникально, New-EventLog просматривает все журналы, включая Security, а обычному пользователю он недоступен.
В PowerShell 7 такой команды нет, он ответит The term 'New-EventLog' is not recognized. Что делать там, написано ниже.
Проверить, что источник есть
# True или False; тоже нужно окно администратора
[System.Diagnostics.EventLog]::SourceExists("TestApi")
# Работает без прав администратора: источник — это ключ реестра
Test-Path "HKLM:\SYSTEM\CurrentControlSet\Services\EventLog\Application\TestApi"
Повторный New-EventLog с тем же именем падает с ошибкой, что источник уже зарегистрирован. Чтобы скрипт можно было запускать сколько угодно раз:
if (-not [System.Diagnostics.EventLog]::SourceExists("TestApi")) {
New-EventLog -LogName Application -Source "TestApi"
}
Записать и прочитать события
Write-EventLog -LogName Application -Source "TestApi" `
-EventId 1000 -EntryType Information -Message "TestApi started"
# Пять последних событий этого источника, в Windows PowerShell и в PowerShell 7
Get-WinEvent -MaxEvents 5 -FilterHashtable @{
LogName = 'Application'; ProviderName = 'TestApi'
}
-EntryType принимает Error, Warning, Information, SuccessAudit или FailureAudit. -EventId — до 65535.
В PowerShell 7 нет New-EventLog
Microsoft убрала из PowerShell 7 все командлеты *-EventLog. Вызовите класс .NET напрямую или Windows PowerShell 5.1, который входит в Windows:
# API .NET, в PowerShell 7 на Windows, от имени администратора
[System.Diagnostics.EventLog]::CreateEventSource("TestApi", "Application")
[System.Diagnostics.EventLog]::WriteEntry(
"TestApi", "TestApi started", "Information", 1000)
# Или старая команда через Windows PowerShell
powershell.exe -NoProfile -Command `
"New-EventLog -LogName Application -Source TestApi"
Microsoft предлагает на замену New-WinEvent, но он пишет события для ETW-провайдеров с манифестом, а не для классического источника вроде TestApi.
Без PowerShell: eventcreate
Команда eventcreate в cmd записывает событие и регистрирует источник, если его ещё нет. Пишет она только от имени источников, которые зарегистрировала сама: с TestApi из New-EventLog выше она падает с ошибкой ERROR: Source parameter is used to identify custom applications/scripts only (not installed applications). Дайте ей своё имя:
eventcreate /L APPLICATION /SO TestApiCmd /T INFORMATION /ID 1 ^
/D "TestApiCmd registered"
Она пишет только в журналы Application и System, а код события должен быть от 1 до 1000.
Удалить источник
# Windows PowerShell 5.1
Remove-EventLog -Source "TestApi"
# PowerShell 7
[System.Diagnostics.EventLog]::DeleteEventSource("TestApi")
Правила для имён источников
- Имя уникально на компьютере и не совпадает с названием журнала.
- Источник пишет в один журнал. Если перенести его в другой журнал, изменение заработает после перезагрузки.
- Регистрируйте источник при установке приложения, а не перед первой записью. Пока Windows не обновит список источников, запись с новым источником не проходит.
- Если в
-LogNameуказать несуществующий журнал,New-EventLogсоздаст его. Журнал появится после первой записи, а первые восемь символов его имени должны отличаться от всех остальных журналов.