파워셸 활용하기!!
[자동으로 윈도우서버 이벤트로그 백업 만들기 2탄]
: 특정기간의 이벤트로그만 백업되도록 하기!
※ 이전 글 - [ 자동으로 윈도우서버 이벤트로그 백업 만들기 1탄 ] :
2021.02.10 - [IT 관련/batch 파일] - 배치파일(Batch File) 활용5 : 자동으로 윈도우서버 이벤트로그 백업 만들기
참고) 우선 이벤트로그 종류 :
2021/02/04 - [IT 관련/batch 파일] - 원도우 이벤트로그 종류
참고) 주기적으로 백업하는 방법 :
2021/02/04 - [IT 관련/batch 파일] - 배치파일(Batch File) 활용4 : 자동으로 파일 및 폴더 백업 만들기
이전에 작성했던 Batch파일을 활용해서 이벤트 로그(Application, Security, System, 등)를 자동 백업하는 방법은 로그를 수집하는 날짜부터 현재까지의 모든 로그를 백업하여, 중복되게 로그가 계속 쌓이는 문제가 있었습니다.
특정 기간의 이벤트 로그를 수집되도록 하는 cmd상의 DOS명령어는 존재하지 않아서,
이 글에서는 PS(poswershell, 파워셸)을 활용하여
" 주기적으로 특정 기간의 윈도우 이벤트를 각각 하나의 엑셀파일로 가져오는 코드 "를 만드는 방법을 작성하였습니다.
사용환경 :
다른 어플리케이션(로그 수집 프로그램)을 사용할 수 없는 상황에서 이벤트 로그를 수집해야 하는 경우
필요한 환경 :
PowerShell 버전 3.0이상
확인하는 방법 :
$PSVersionTable.PSVersion
사용하는 PS(Powershell) 명령어 :
$get-date, $now, $Get-WinLog
Get-WinEvent
[-MaxEvents <Int64>]
[-ComputerName <String>]
[-Credential <PSCredential>]
[-FilterHashtable] <Hashtable[]> # 하나 이상의 이벤트 로그에서 이벤트를 선택하기 위해 해시 테이블 형식의 쿼리를 지정합니다. 쿼리에 하나 이상의 키/값 쌍이 있는 해시 테이블이 포함되어 있습니다.
[-Force]
[-Oldest]
[<CommonParameters>]
유효한 Get-WinEvent 키/값 쌍은 다음과 같습니다. :
LogName=<String[]>
ProviderName=<String[]>
Path=<String[]>
Keywords=<Long[]>
ID=<Int32[]>
Level=<Int32[]>
StartTime=<DateTime>
EndTime=<DateTime>
UserID=<SID>
Data=<String[]><named-data>=<String[]>
SuppressHashFilter=<Hashtable>
사용하는 PS(Powershell) 지식 :
작업 스케줄링
※ 백업을 하는 조건 ※
1) 매주 수요일 밤 10시 5분
2) 파일명에 백업날짜가 포함
3) 백업 윈도우 이벤트로그 중 Application, Security, System 백업
1. 시작 날짜 정하기 (일주일 단위) : "현재 날짜에서 -7일"
get-date : 현재 날짜가져오기
날짜.AddDays(날짜기준 필요한 날짜만큼 더하거나 빼면 됨)
$now=get-date
$startdate=$now.adddays(-7)
$enddate=$now
2. 로그 추출하기 : Get-WinEvent 명령어 사용.
Get-WinEvent -FilterHashtable @{LogName=로그이름(System, Application, Security 등); StartTime=시작시간; EndTime=끝나는시간; Level=로그레벨}
* level - 1 : Error, 2 : Warning, 3 : Infomation, 4 : Debugging, 5 : Verbose
$log_1=Get-WinEvent -FilterHashtable @{LogName='System';StartTime=$startdate;EndTime=$enddate;Level=2}
$log_1 | Select-Object LogName, ID, TimeCreated, Message, Level, LevelDisplayName
3. 엑셀 파일로 추출하기 (Export-CSV 명령어 사용)
로그정보 | Export-CSV 경로\파일명
- 파일명 : 시작날짜-끝나는날짜_로그명.csv
* Encoding을 UTF8로 설정 안 해주면, 한글 일부가 깨짐.
Set-Variable -Name ExportFolder -Value "C:\TEST\"
$ExportFile=$ExportFolder + $startdate.ToString("yyyy-MM-dd-") + $enddate.ToString("yyyy-MM-dd_") + "System" +".csv"
$result | Export-CSV $ExportFile -Encoding UTF8
[테스트]
4. 전체 로그 파일 추출하는 코드
[log_backup.ps1]로 저장
* 로그는 Application, System, Security를 추출,
* Application, Systme 로그는 Error(Level 1), Warning(Level 2)를 추출. Security는 따로 로그 레벨이 없고 전부 0이어서 따로 If, else문으로 만듦.
* 추출한 로그에서 LogName, ID, TimeCreated, Message, Level 필드 값을 가져와서 csv파일로 추출하도록 설정.
Set-Variable -Name LogNames -Value @("Application", "System", "Security") #로그 종류 3가지
Set-Variable -Name ExportFolder -Value "C:\TEST\" #로그파일 저장할 경로
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
$el_c1 = @()
$now=get-date #현재 날짜
$startdate=$now.addDays(-7) #시작 날짜 : 현재날짜에서 일주일 전
$enddate=$now #현재 날짜
foreach($log in $LogNames) { #로그 종류에 따라 for문
Write-Host Processing $log
if($log -eq "Security"){ #로그 종류가 'Security' 일때
$log_security= Get-WinEvent -FilterHashtable @{LogName=$log;StartTime=$startdate;EndTime=$enddate} # 일주일치 로그 추출
$log_result = $log_security | Select-Object LogName, ID, TimeCreated, Message, Level # 추출한 로그에서 LogName, ID, TimeCreated, Message, Level 필드 추출
$ExportFile=$ExportFolder + $startdate.ToString("yyyy-MM-dd-") + $enddate.ToString("yyyy-MM-dd_") + "Security" +".csv" # 저장되는 로그 파일명
$log_result | Export-CSV $ExportFile -Encoding UTF8 #CSV로 로그 파일 추출
}
else { #로그 종류가 'Security'가 아닌 'Application', 'System' 일때
$log_1 = Get-WinEvent -FilterHashtable @{LogName=$log;StartTime=$startdate;EndTime=$enddate;Level=1} # 일주일치 level 1인 로그 추출
$log_2 = Get-WinEvent -FilterHashtable @{LogName=$log;StartTime=$startdate;EndTime=$enddate;Level=2} # 일주일치 level 2인 로그 추출
$ExportFile=$ExportFolder + $startdate.ToString("yyyy-MM-dd-") + $enddate.ToString("yyyy-MM-dd_") + $log +".csv" # 저장되는 로그 파일명
$el_c1 = $log_1 + $log_2 # 로그 두개 합치기
$el_sorted1 = $el_c1 | Select-Object LogName, ID, TimeCreated, Message, Level, LevelDisplayName | Sort-Object TimeCreated # TimeCreated 필드로 정렬하고, 추출한 로그에서 LogName, ID, TimeCreated, Message, Level 필드 추출
$el_sorted1| Export-CSV $ExportFile -Encoding UTF8 #CSV로 로그 파일 추출
}
}
Write-Host Done!
pause
5. 코드 실행하기 : 위의 스크립트 실행하기 위해서 권한 문제로 인해 아래 명령어로 실행해야 합니다.
PowerShell.exe -ExecutionPolicy ByPass -File log_backup.ps1
6. 작업 스케줄링 : Powershell에서 명령어를 통해서 스크립트를 주어진 기간에 주기적으로 실행되도록 스케줄링을 할 수 있습니다. (New-JobTrigger, Register-ScheduledJob 명령어 사용)
※ 매주 수요일 밤 10시 5분에 실행되도록 설정.
New-JobTrigger 스케줄일정
Register-ScheduledJob -Name 스케줄명 -FilePath 스크립트있는경로 -Trigger 스케줄일정
$Trigger=New-JobTrigger -Weekly -At “10:05PM” -DaysOfWeek “Wednesday”
Register-ScheduledJob -Name “Export Weekly Logs” -FilePath “C:\Test\log_backup.ps1” -Trigger $Trigger
Get-ScheduledJob 명령어를 통해서 스케줄 등록된 것 확인 가능합니다.
7. 실행 결과
[참조]
https://eventlogxp.com/blog/exporting-event-logs-with-windows-powershell/amp/