Для логирования всех действий, которые выполняются PowerShell скриптом, удобно использовать логирование в простые текстовые лог файлы. Наличие лог файла скрипт удобно при отладке ошибок и просмотра выполненных действий. В этой статье рассмотрим, как в PowerShell скриптах использовать логирование в текстовых файлы.
Перенаправление вывода из команд PowerShell в лог файл
По умолчанию результаты запуска команд PowerShell выводится в консоль. Если вы хотите перенаправить вывод команды PowerShell в текстовый файл можно использовать один из следующих способов:
- Перенаправление с помощью оператора
>>
- Добавить простой текст в конец лог файла с помощью
Add-Content
- Отправить данные с сохранением форматирования в файл через
Out-File
Ниже представлены примеры всех трех команд, которые добавят новую строку со значением из команды PowerShell в лог файл:
Write-Output "Файлы созданы успешно на $env:computername" >> C:\PS\Logs\TestLog.txt
Add-Content -Path C:\PS\Logs\TestLog.txt -Value "Файлы созданы успешно на $env:computername"
"Файлы созданы успешно на $env:computername" | Out-File -FilePath C:\PS\Logs\TestLog.txt –Append
# Параметр -Append позволяет дописать данные в файл, не затирая имеющееся
Недостаток использования таких команд для записи логов:
- В лог не пишется метка даты/времени (timestamp), когда произошло событие
- Каждый раз, когда вы хотите записать что-то в лог, нужно вызывать довольно сложную конструкцию
- Путь к лог файлу задается жестко
Функция для логирования в PowerShell скрипте
Если вы хотите использовать более удобный метод логирования, проще всего добавить в PowerShell скрипт отдельную функцию, которая будет отправлять данные в лог файл, добавляя метку времени. Пример такой функции:
$Logfile = "C:\PS\Logs\$($env:computername)posh.log"
function WriteLog
{
Param ([string]$LogString)
$Stamp = (Get-Date).toString("yyyy/MM/dd HH:mm:ss")
$LogMessage = "$Stamp $LogString"
Add-content $LogFile -value $LogMessage -Encoding UTF8
}
-
$Logfile
– задайте путь к файлу лога (каталог должен существовать). -
$($env:computername)posh.log
— добавляет имя компьютера (hostname) в имя лог файла -
$Stamp
– получает текущую дату и форматирует ее согласно шаблона для временной метки в логе
Теперь, чтобы записать что-то в лог файл, нужно просто вызвать функцию WriteLog.
WriteLog "Скрипт запущен”
WriteLog "Выполняю вычисления…."
Start-Sleep 20
WriteLog "Скрипт выполнен успешно"
Теперь в лог файле будет указано время, когда была добавлена строка.
Теперь в любых PS1 скриптах вывод в консоль через Write-Host можно заменить на WriteLog.
Get-Content -Tail 10 -Wait "C:\PS\Logs\$($env:computername)posh.log"
Start-Transcript: автоматическое логирование всех команд PowerShell
В PowerShell есть еще одна встроенная возможность для записи в текстовый лог файл всех команд, запускаемых в консоли, и их результатов.
Чтобы начать запись команд в текущей PowerShell сессии, выполните команду:
Start-Transcript
Это создаст текстовый файла в каталоге Documents профиля текущего пользователя, с именем формата (имя файла указано в консоли).
Transcript started, output file is C:\Users\Administrator\Documents\PowerShell_transcript.DC01.inhP7egx.20210315041442.txt
Start-Transcript -Append C:\PS\Logs\PSScriptLog.txt
Параметр -Append указывает, что нужно дописывать новые данные в конец лог файла (не перезатирая его).
Выполните несколько произвольных PowerShell команд, которые выводят результаты в консоль. Например, выведем список тяжелых запущенных процессов, запущенных служб и состояние репликации в AD:
Write-Host "transcript logging"
Get-Process| where-object {$_.WorkingSet -GT 300000*1024}|select processname,@{l="Used RAM(MB)"; e={$_.workingset / 1mb}} |sort "Used RAM(MB)" –Descending
Get-Service | Where-Object {$_.status -eq 'running'}
Get-ADReplicationFailure -Target DC01
Завершите запись лога для текущей сессии:
Stop-Transcript
Теперь откройте текстовый файл с логом.
В этом текстовом логе будет содержаться вся история PowerShell команд, которые запускались, и все результаты, которые выводился в консоль.
Команду Start-Transcript/Stop-Transcript можно использовать в вашиз PowerShell скриптах, чтобы нативно логировать все действия и результаты.
С помощью параметра групповой политики Turn on PowerShell Transcription в Computer Configuration –> Administrative Templates –> Windows Components –> Windows PowerShell можно включить автоматическое логирование всех запускаемых PowerShell команд и выводимых результатов на компьютере. После обновления настроек GPO, для каждого запущенного процесса powershell.exe будет создаваться отдельный текстовый лог файл, куда будут записываться все PS команды и результаты.
Для Windows PowerShell:
reg add "HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\PowerShell\Transcription" /v "EnableTranscripting" /t REG_DWORD /d 1 /f
reg add "HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\PowerShell\Transcription" /v "EnableInvocationHeader" /t REG_DWORD /d 1 /f
reg add "HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\PowerShell\Transcription" /v "OutputDirectory" /t REG_SZ /d C:\PS\LOGS /f
Для нового PowerShell Core:
reg add "HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\PowerShellCore\Transcription" /v "EnableTranscripting" /t REG_DWORD /d 1 /f
reg add "HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\PowerShellCore\Transcription" /v "EnableInvocationHeader" /t REG_DWORD /d 1 /f
reg add "HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\PowerShellCore\Transcription" /v "OutputDirectory" /t REG_SZ /d C:\PS\LOGS /f
Start-Transcript не всю информацию записывает, например если я на какую-то команду указываю -verbose то в консоли получаю подробные сведения, а вот в логе этого нет.