[ IT 인프라 – 자동화 & 스크립트 ] 이벤트 뷰어에 사용자 지정 이벤트 ID 발생시키기 2부: PowerShell 가이드
지난 [1부 포스팅]에서는 eventcreate 명령어와 Bat 파일을 통해 빠르고 간단하게 이벤트 로그를 남기는 방법을 알아보았습니다. 하지만 eventcreate는 보안상의 이유로 이벤트 ID를 1~1000까지만 입력할 수 있다는 치명적인 한계가 있었죠.
오늘은 시스템 엔지니어의 진정한 무기인 PowerShell을 활용하여, 1000번의 제한을 가볍게 우회하고 9999나 15004 같은 고유 ID를 자유자재로 생성하는 방법을 완벽하게 파헤쳐 보겠습니다.
📝 핵심 내용 요약
- PowerShell의
Write-EventLog명령어를 사용하면 1~65535까지의 모든 이벤트 ID를 자유롭게 생성할 수 있습니다.- 이벤트 소스를 등록하기 위해 스크립트 최초 실행 시 반드시 관리자 권한이 필요합니다.
- [중요] 최신 PowerShell Core(v6+) 환경과 기존 Windows PowerShell(v5.1) 간의 명령어 호환성 차이를 인지해야 합니다.
1. 왜 PowerShell을 써야 할까? (eventcreate의 한계 돌파)
실무에서 모니터링 시스템은 각각 고유한 이벤트 ID를 필터링하여 알람을 발생시킵니다. 예를 들어 Exchange Server의 리소스 고갈 알람인 ‘Back Pressure’ 이벤트 ID는 15004입니다.
만약 모니터링 시스템이 15004번 알람을 제대로 수신하는지 테스트하고 싶은데, 1부에서 다룬 eventcreate를 쓰면 오류가 발생하며 튕겨냅니다. 하지만 PowerShell은 .NET Framework와 Windows API에 직접 접근하므로 이러한 제한 없이 원하는 모든 로그를 정교하게 찔러 넣을 수 있습니다.
2. Write-EventLog 명령어 기본 구조 상세 분석
PowerShell에서 이벤트를 기록할 때 가장 널리 쓰이는 명령어는 Write-EventLog입니다. 파라미터 구조는 직관적이며 다음과 같습니다.
| 파라미터 | 기능 설명 | 허용 값 및 예시 |
-LogName | 로그 이름: 이벤트가 기록될 위치 (필수) | Application, System |
-Source | 이벤트 소스: 이벤트를 발생시킨 주체 (필수) | JimmyScript, BackupMonitor |
-EventId | 이벤트 ID: 로그의 고유 식별 번호 (필수) | 1 ~ 65535 사이의 숫자 (예: 9999, 15004) |
-EntryType | 이벤트 유형: 로그의 심각도 | Information, Warning, Error, SuccessAudit |
-Message | 설명 메시지: 이벤트 뷰어에 남길 상세 내용 | "모니터링 알람 수신 테스트입니다." |
💡 Tip : PowerShell로 이벤트를 기록하기 위해서는 해당 -Source(이벤트 소스)가 시스템 레지스트리에 사전 등록되어 있어야 합니다. 등록되지 않은 소스로 Write-EventLog를 실행하면 에러가 발생합니다.
3. PowerShell 스크립트 실전: 1000번 이상의 고유 ID 생성
이제 레지스트리에 소스가 존재하는지 먼저 체크한 뒤, 없다면 생성하고 이벤트를 발생시키는 안전한 자동화 스크립트를 작성해 보겠습니다. 아래 코드를 복사하여 CustomEvent.ps1로 저장하시면 됩니다.
📜 Version 1: 깔끔한 버전 (Clean Version)
즉시 서버에 배포하여 실행할 때 사용하기 좋은 버전입니다.
PowerShell
$LogName = "Application"
$SourceName = "JimmyPowerShell"
if ([System.Diagnostics.EventLog]::SourceExists($SourceName) -eq $false) {
Write-Host "[$SourceName] Source Registering..." -ForegroundColor Yellow
New-EventLog -LogName $LogName -Source $SourceName
Write-Host "Source Registered Successfully!" -ForegroundColor Green
}
Write-Host "Event Logging Started..." -ForegroundColor Cyan
Write-EventLog -LogName $LogName -Source $SourceName -EventId 9999 -EntryType Information -Message "PowerShell을 활용한 커스텀 모니터링 이벤트(9999) 테스트입니다."
Write-EventLog -LogName $LogName -Source $SourceName -EventId 15004 -EntryType Error -Message "리소스 고갈 치명적 오류: Back Pressure 경고 테스트 로그입니다."
Write-Host "Event Logging Completed!" -ForegroundColor Green
📜 Version 2: 상세 주석 버전 (Line-by-Line Commented Version)
PowerShell 스크립트의 작동 원리를 한 줄 한 줄 파악하고 싶은 분들을 위한 버전입니다.
PowerShell
<#
.SYNOPSIS
Windows 이벤트 뷰어 커스텀 로그 생성 스크립트 (PowerShell 기반)
.DESCRIPTION
1000번 이상의 이벤트 ID(예: 9999, 15004)를 생성하기 위한 스크립트입니다.
#>
# 1. 변수 설정
$LogName = "Application" # 이벤트가 기록될 기본 위치를 지정
$SourceName = "JimmyPowerShell" # 이벤트를 발생시키는 주체
# 2. 이벤트 소스 존재 여부 확인 및 등록 (최초 실행 시 관리자 권한 필수)
# 현재 시스템 레지스트리에 $SourceName 변수에 지정된 이름이 존재하는지 체크합니다.
if ([System.Diagnostics.EventLog]::SourceExists($SourceName) -eq $false) {
# 소스가 없다면 노란색 텍스트로 등록 진행 상태를 화면에 출력합니다.
Write-Host "[$SourceName] 소스가 존재하지 않아 새로 등록합니다..." -ForegroundColor Yellow
# 지정한 로그 위치(Application)에 새로운 이벤트 소스를 레지스트리에 생성합니다.
New-EventLog -LogName $LogName -Source $SourceName
# 정상적으로 등록이 완료되면 녹색 텍스트로 완료 메시지를 출력합니다.
Write-Host "소스 등록 완료!" -ForegroundColor Green
}
# 3. 1000번 이상의 커스텀 이벤트 로그 발생 실전
# 본격적인 로그 생성을 알리는 청록색 메시지를 출력합니다.
Write-Host "이벤트 로그 생성을 시작합니다..." -ForegroundColor Cyan
# (1) 커스텀 모니터링용 정보 로그 (ID: 9999)
# Write-EventLog 명령어로 9999번 ID의 '정보(Information)' 수준 이벤트를 기록합니다.
Write-EventLog -LogName $LogName -Source $SourceName -EventId 9999 -EntryType Information -Message "PowerShell을 활용한 커스텀 모니터링 이벤트(9999) 테스트입니다."
# (2) Exchange Back Pressure 경고 알람 (ID: 15004)
# eventcreate의 1000번 제한을 넘어, 15004번 ID의 '오류(Error)' 수준 이벤트를 완벽하게 기록합니다.
Write-EventLog -LogName $LogName -Source $SourceName -EventId 15004 -EntryType Error -Message "리소스 고갈 치명적 오류: Back Pressure 경고 테스트 로그입니다."
# 모든 작업이 끝났음을 녹색 텍스트로 화면에 출력합니다.
Write-Host "이벤트 생성이 모두 완료되었습니다." -ForegroundColor Green
(1) Clean Version의 스크립트를 사용합니다. 이때 가능한 관리자 권한이 있는 PowerShell을 켜줍니다.

(2)위의 내역을 실행한다면 다음과 같이 정상 실행이 되는 것을 확인 할 수 있습니다. 만약 안된다면 PowerShell의 버전을 확인해보시길 바랍니다.

(3) 완료 후에 이벤트 뷰어를 확인해주신다면 다음과 같이 Event ID : 9999 와 Event ID : 15004가 정해진 수준에 맞추어 발생하는 것을 확인 할 수 있습니다.

4. ⚠️ 주의사항: PowerShell EventLog 명령어의 한계 및 예외 사항
PowerShell이 아무리 강력하더라도 인프라 엔지니어라면 반드시 짚고 넘어가야 할 한계점과 버전 호환성 이슈가 있습니다.
- 최초 실행 시 권한 문제: 앞서 보신 스크립트의
New-EventLog명령어로 새로운 소스를 레지스트리에 등록하려면 반드시 최초 1회는 PowerShell을 ‘관리자 권한’으로 실행해야 합니다. 등록된 이후에 이벤트를 발생(Write-EventLog)시키는 것은 일반 권한으로도 가능합니다. - PowerShell Core (v6 이상) 지원 중단:
Write-EventLog명령어는 Windows OS에 종속된 구형 API를 사용합니다. 따라서 멀티플랫폼을 지원하는 최신 PowerShell 7 (Core) 버전에서는 이 명령어가 더 이상 작동하지 않습니다. - 대안 기술 (
New-WinEvent): 마이크로소프트는 ETW(Event Tracing for Windows) 기반의New-WinEvent사용을 권장합니다. 하지만 이 방식은 복잡한 XML 매니페스트(Manifest) 파일과 DLL 컴파일을 요구하므로, 단순한 인프라 관리용 스크립트로는 여전히 Windows PowerShell 5.1(대부분의 서버 기본 설치) 환경에서Write-EventLog를 사용하는 것이 실무 표준입니다.
5. 마무리
오늘은 1부의 한계를 넘어, PowerShell을 활용해 1000번 이상의 고유 이벤트 ID(예: 15004, 9999)를 자유롭게 생성하고 모니터링 시스템을 완벽하게 테스트하는 방법을 알아보았습니다.
하지만 스크립트를 운영 환경에 배포하다 보면, 담당자가 실수로 코드를 건드리거나 실행 정책(Execution Policy)에 막혀 작동하지 않는 경우가 생깁니다. 다음 마지막 3부에서는 우리가 만든 이 강력한 PowerShell 스크립트를 더블클릭만으로 안전하게 실행할 수 있는 독립적인 실행 파일(.exe)로 패키징(PS2EXE)하는 비법을 다뤄보겠습니다. 다음 글에서 뵙겠습니다!