PowerShell 스크립트에서 간단한 텍스트 로그 파일을 활용하면 스크립트 실행 상태를 제어하고 모든 활동을 추적할 수 있습니다. 이는 오류 디버깅이나 스크립트 동작 감사에 매우 유용합니다. 이 글에서는 PowerShell 스크립트에서 출력을 텍스트 로그 파일에 기록하는 다양한 방법을 소개합니다.
1. 기본적인 방법: 출력 결과를 텍스트 파일로 내보내기
가장 간단한 경우, 정보 메시지나 PowerShell 명령의 실행 결과를 텍스트 로그 파일에 기록하려면 다음과 같은 방식으로 PS 출력을 텍스트 파일로 리디렉션할 수 있습니다.
Write-Output "Files are successfully created in $env:computername" >> C:\PS\Logs\TestLog.txt
Add-Content -Path C:\PS\Logs\TestLog.txt -Value "Files are successfully created in $env:computername"
"Files are successfully created in $env:computername" | Out-File -FilePath C:\PS\Logs\TestLog.txt –Append위의 모든 방식은 지정한 텍스트를 한 줄로 추가하여 txt 파일에 기록합니다. 만약 로그 파일을 실행할 때마다 덮어쓰고 싶다면 Set-Content cmdlet을 사용하면 됩니다.
2. 타임스탬프 추가하기
이 방법의 가장 큰 단점은 로그 항목(이벤트 발생)이 언제 기록되었는지 알 수 없다는 점입니다. 이를 보완하려면 현재 타임스탬프를 로그 파일에 함께 기록하면 됩니다. 타임스탬프가 있으면 스크립트가 실행된 시점과 특정 이벤트가 발생한 시간을 정확히 파악할 수 있습니다.
더욱 편리하게 사용하려면, PowerShell 스크립트에 별도의 함수를 만들어 전달받은 데이터를 로그 파일에 기록하고 각 이벤트마다 타임스탬프를 추가하도록 구성할 수 있습니다.
아래와 같이 함수를 작성할 수 있습니다.
$Logfile = "C:\PS\Logs\proc_$env:computername.log"
function WriteLog
{
Param ([string]$LogString)
$Stamp = (Get-Date).toString("yyyy/MM/dd HH:mm:ss")
$LogMessage = "$Stamp $LogString"
Add-content $LogFile -value $LogMessage
}이후 무언가를 로그에 기록하고 싶을 때 WriteLog 함수를 호출하면 됩니다.
WriteLog "The script is run"
WriteLog "Calculating…."
Start-Sleep 20
WriteLog "The script is successfully executed"이제 로그 파일에서 각 항목의 기록 시간을 확인할 수 있습니다.
기존 스크립트에서 Write-Host 호출을 WriteLog 호출로 대체하면 콘솔 출력과 로그 기록을 동시에 처리할 수 있습니다.
3. Start-Transcript: 세션 전체 기록하기
PowerShell에는 PS 콘솔에 표시되는 모든 명령과 출력 결과를 텍스트 로그 파일에 저장하는 기록(Transcript) 기능이 내장되어 있습니다.
현재 PowerShell 세션을 로그로 기록하려면 Start-Transcript cmdlet을 사용합니다.
명령을 실행하면 모든 명령의 출력이 기록되는 파일 경로를 알려주는 메시지가 표시됩니다. 기본적으로 로그 파일은 현재 사용자 프로필에 저장됩니다.
Transcript started, output file is C:\Users\user\Documents\PowerShell_transcript.DESKTOP-P2FHTKQ.+IzDgZiN.20210908163729.txt
텍스트 파일의 경로를 직접 지정할 수도 있습니다.
Start-Transcript -Append C:\PS\Logs\PSScriptLog.txt–Append 옵션은 새로운 세션의 기록이 파일 끝에 추가되도록 지정합니다(기존 내용을 덮어쓰지 않음).
이제 결과를 콘솔에 출력하는 몇 가지 PowerShell 명령을 실행해 보겠습니다. 예를 들어 실행 중인 프로세스 목록, 서비스 목록, AD 복제 상태를 표시해 보겠습니다.
Get-Process| where-object {$_.WorkingSet -GT 500000*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 mun-dc01현재 PowerShell 세션의 기록을 중지하려면 다음 명령을 실행합니다.
Stop-Transcript그런 다음 기록 로그 파일을 열어보면, 콘솔에서 실행된 모든 PowerShell 명령의 전체 기록과 모든 출력 결과가 로그에 저장되어 있는 것을 확인할 수 있습니다.
오류와 경고까지 모두 기록되기 때문에 복잡한 PowerShell 스크립트를 디버깅할 때 매우 유용합니다. PowerShell 스크립트 내에서 Start-Transcript와 Stop-Transcript cmdlet을 사용하면 모든 동작과 출력을 기본 기능만으로 손쉽게 로깅할 수 있습니다.
4. 그룹 정책으로 PowerShell 기록 자동 활성화
그룹 정책의 Turn on PowerShell Transcription(컴퓨터 구성 → 관리 템플릿 → Windows 구성 요소 → Windows PowerShell) 옵션을 사용하면 컴퓨터에서 실행되는 모든 PowerShell 명령과 출력을 자동으로 기록할 수 있습니다. 컴퓨터에 GPO 설정이 적용되면 실행 중인 각 powershell.exe 프로세스마다 별도의 텍스트 로그 파일이 생성되고, 모든 PS 명령과 그 출력이 기록됩니다.