Как добавить источник журнала событий в 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 создаст его. Журнал появится после первой записи, а первые восемь символов его имени должны отличаться от всех остальных журналов.
Консультирую по продукту, собираю MVP и учу делать продукты самостоятельно. Поработать со мной →