Вместо использования текстовых лог файлов в скриптах, можно записывать информации о событиях непосредственно в журналы Event Viewer. В этой статье мы рассмотрим, как записывать логи в журналы событий Windows из скрипта PowerShell или из командной строки.
Для записи информации в журнал событий используется командлет Write-EventLog. Например, что записать информационного событие в журнал Application, выполните:
Write-EventLog -LogName Application -Source "Application" -EntryType Information -EventID 1 -Message "PS1 Script started"
Можно добавить отдельный источник событий в существующий журнал:
New-EventLog -LogName Application -Source "MyScripts"
Теперь можно записывать события с собственным источником:
Write-EventLog -LogName Application -Source "MyScripts" -EntryType Warning –EventID 1 –Message "PS1 Script started"
Откройте консоль журнала событий (
eventvwr.msc
), разверните журнал Application и проверьте, что новое событие с вашим описанием было добавлено в лог.
Если вы хотите добавить в журнал событие из BAT/CMD скрипта, нужно использовать команду eventcreate:
eventcreate /t information /l application /id 1 /d "BAT script started"
Можно создать для ваших логов отдельный журнал событий. Его можно создать с помощью команды New-EventLog.
New-EventLog -LogName CustomPSLog -source 'MyScripts','Function1','Function2','Function3'
Если вы пишете события в собственный журнал, то в скрипте перед созданием нового журнала нужно проверять, не создан ли он:
If ([System.Diagnostics.EventLog]::SourceExists(‘CustomPSLog’) -eq $False) {
New-EventLog -LogName CustomPSLog -Source ….
}
Чтобы новый журнал появится в графической консоли Event Viewer, в него нужно отправить хотя бы одно событие:
Write-EventLog -LogName CustomPSLog -Source MyScripts -EntryType Information -EventID 1 -Message "Test"
Новый журнал появится в корне раздела Applications and Services Logs. Для файла журнала будет создан новый EVTX файл в папке
%SystemRoot%\System32\Winevt\Logs
.
Для поиска и фильтрации событий в журналах Event Viewer используется командлет Get-WinEvent. Вывести список последних событий в вашем журнале:
Get-WinEvent -FilterHashtable @{logname='CustomPSLog';id=1}|ft TimeCreated,Id,Message | Select-Object -First 5
Командлет Write-EventLog не поддерживается в новых версиях PowerShell Core. При запуске команды с ним появится ошибка:
Write-EventLog: The term 'Write-EventLog' is not recognized as a name of a cmdlet, function, script file, or executable program.
Вместо него в PowerShell Core 7.x нужно использовать New-WinEvent. Однако для его использования нужно регистрировать отдельный провайдер, что может вызвать затруднения. Гораздо проще в скриптах PowerShell Core сначала импортировать модуль Microsoft.PowerShell.Management с опцией -UseWindowsPowerShell. После этого в скрипте PowerShellCore можно использовать командлет Write-EventLog:
Import-Module Microsoft.PowerShell.Management -UseWindowsPowerShell
Write-EventLog -LogName CustomPSLog1 -Source CustomPSLog -EntryType Information -EventID 1 -Message "Test2"
Для записи в журналы событий Windows с помощью командлета Write-EventLog нужны права администратора. Под пользователем без прав администратора можно записать события только в кастомные журналы Event Viewer, созданные администратором.