Используем лог-файлы для скриптов PowerShell

Для логирования всех действий, которые выполняются 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 позволяет дописать данные в файл, не затирая имеющееся

Если нужно каждый раз перезатирать содержимое лог-файла, используйте Set-Content.

Add-Content запись информации из скрипта powershell в лог

Недостаток использования таких команд для записи логов:

  • В лог не пишется метка даты/времени (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 "Скрипт выполнен успешно"

Теперь в лог файле будет указано время, когда была добавлена строка.

функция ведения тектового лог файла с меткой времени в powershell

Теперь в любых PS1 скриптах вывод в консоль через Write-Host можно заменить на WriteLog.

Для вывода лога PowerShell на экран в реальном времени, используйте команду:

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

Start-Transcript - ведение полного лога действий для powershell скрипта

Завершите запись лога для текущей сессии:

Stop-Transcript

Теперь откройте текстовый файл с логом.

пример лога всех действий в powershell

В этом текстовом логе будет содержаться вся история PowerShell команд, которые запускались, и все результаты, которые выводился в консоль.

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

Команду Start-Transcript/Stop-Transcript можно использовать в вашиз PowerShell скриптах, чтобы нативно логировать все действия и результаты.

С помощью параметра групповой политики Turn on PowerShell Transcription в Computer Configuration –> Administrative Templates –> Windows Components –> Windows PowerShell можно включить автоматическое логирование всех запускаемых PowerShell команд и выводимых результатов на компьютере. После обновления настроек GPO, для каждого запущенного процесса powershell.exe будет создаваться отдельный текстовый лог файл, куда будут записываться все PS команды и результаты.

Групповая политика Turn on PowerShell Transcription

Также можно включить подобное транскрибирование (логирование) всех команд и скриптов PowerShell через реестр (можно использовать сетевые UNC пути для каталогов с логами).

Для 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


Предыдущая статья Следующая статья


Комментариев: 1 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)