🔍 Windows 시스템 오류가 발생했는데 원인을 찾을 수 없어 답답하신가요? 이벤트 로그 분석 하나로 모든 시스템 문제의 근본 원인을 찾을 수 있어요!
Windows 시스템을 운영하다 보면 예상치 못한 오류, 성능 저하, 보안 위협 등 다양한 문제들과 마주치게 됩니다. 이런 상황에서 가장 강력한 문제 해결 도구가 바로 Windows 이벤트 로그입니다.
이벤트 로그는 시스템에서 발생하는 모든 중요한 활동을 기록하는 Windows의 핵심 기능입니다. 하드웨어 오류부터 소프트웨어 충돌, 보안 침해까지 모든 것이 여기에 기록되죠. 이벤트 로그를 제대로 분석할 줄 안다면, 그 어떤 시스템 문제도 해결할 수 있습니다.
🎯 Windows 이벤트 로그란? 시스템의 블랙박스
이벤트 로그의 정의와 중요성
Windows 이벤트 로그는 운영체제와 애플리케이션에서 발생하는 모든 중요한 사건들을 시간순으로 기록하는 시스템입니다. 자동차의 블랙박스처럼, 시스템에서 일어나는 모든 일을 빠짐없이 기록해두죠.
이벤트 로그가 기록하는 정보들
- 시스템 시작/종료 기록
- 애플리케이션 설치/제거 내역
- 하드웨어 오류 및 드라이버 문제
- 보안 관련 활동 (로그인, 권한 변경 등)
- 네트워크 연결 상태 변화
- 서비스 시작/중지 기록
- 성능 관련 경고
이벤트 로그의 비즈니스 가치
영역 | 가치 | 구체적 효과 |
---|---|---|
문제 해결 | 빠른 원인 파악 | 문제 해결 시간 70% 단축 |
보안 관리 | 침해 사고 탐지 | 보안 위협 조기 발견 |
성능 최적화 | 병목 지점 식별 | 시스템 성능 20-30% 향상 |
컴플라이언스 | 감사 증적 확보 | 규정 준수 요구사항 충족 |
예방 관리 | 사전 장애 예측 | 시스템 다운타임 80% 감소 |
📊 이벤트 뷰어 기본 사용법
이벤트 뷰어 실행 방법

# 방법 1: 실행 창에서
eventvwr.msc
# 방법 2: PowerShell에서
Get-EventLog -List
# 방법 3: 제어판에서
제어판 → 관리 도구 → 이벤트 뷰어
# 방법 4: 시작 메뉴 검색
"이벤트 뷰어" 또는 "Event Viewer" 검색
이벤트 뷰어 인터페이스 구성
주요 로그 카테고리
1. Windows 로그 (Windows Logs)
├── Application (응용 프로그램 로그)
├── Security (보안 로그)
├── Setup (설치 로그)
├── System (시스템 로그)
└── Forwarded Events (전달된 이벤트)
2. 응용 프로그램 및 서비스 로그
├── Microsoft
│ ├── Windows
│ │ ├── PowerShell
│ │ ├── Windows Defender
│ │ └── TaskScheduler
└── Third-party Applications
각 로그 카테고리별 주요 내용
Application 로그
- 프로그램 시작/종료 정보
- 애플리케이션 오류 및 경고
- 소프트웨어 충돌 정보
- 프로그램별 상세 로그
Security 로그
- 사용자 로그인/로그아웃
- 권한 변경 시도
- 파일/폴더 접근 기록
- 정책 변경 사항
- 감사 실패/성공 이벤트
System 로그
- 시스템 서비스 상태 변화
- 하드웨어 오류 정보
- 드라이버 문제
- 시스템 시작/종료 이벤트
- 네트워크 어댑터 상태
🔍 이벤트 레벨과 이벤트 ID 이해하기
이벤트 레벨 분류

레벨 | 아이콘 | 의미 | 대응 우선순위 |
---|---|---|---|
오류 (Error) | ❌ | 중대한 문제 발생 | 즉시 대응 |
경고 (Warning) | ⚠️ | 잠재적 문제 상황 | 모니터링 필요 |
정보 (Information) | ℹ️ | 정상 작업 기록 | 참고용 |
감사 성공 (Audit Success) | ✅ | 보안 작업 성공 | 정상 상태 |
감사 실패 (Audit Failure) | ❌ | 보안 작업 실패 | 보안 검토 |
중요한 이벤트 ID 목록
시스템 관련 주요 이벤트 ID
6005: 이벤트 로그 서비스 시작
6006: 이벤트 로그 서비스 중지
6008: 시스템이 예기치 않게 종료됨
6009: Microsoft 제품 버전 정보
6013: 시스템 가동 시간 정보
1074: 시스템 종료/재시작 (사용자/프로세스별)
1076: 전원 상태 변경
7000: 서비스 시작 실패
7001: 서비스 종속성 오류
7023: 서비스가 오류로 종료됨
7026: 시스템 시작 시 서비스 로딩 실패
보안 관련 주요 이벤트 ID
4624: 계정이 성공적으로 로그온함
4625: 계정 로그온 실패
4634: 계정이 로그오프됨
4647: 사용자가 로그오프를 시작함
4648: 명시적 자격 증명을 사용하여 로그온 시도
4656: 개체에 대한 핸들이 요청됨
4672: 특별한 권한이 새 로그온에 할당됨
4720: 사용자 계정이 생성됨
4722: 사용자 계정이 활성화됨
4725: 사용자 계정이 비활성화됨
4728: 글로벌 그룹에 구성원이 추가됨
4732: 로컬 그룹에 구성원이 추가됨
4771: Kerberos 사전 인증 실패
4776: 도메인 컨트롤러에서 자격 증명 유효성 검사 실패
애플리케이션 관련 주요 이벤트 ID
1000: 응용 프로그램 오류 (애플리케이션 충돌)
1001: 응용 프로그램 응답 없음
1002: 응용 프로그램 중단 오류
1026: .NET 런타임 오류
1309: 응용 프로그램 예외
🛠️ PowerShell을 이용한 고급 로그 분석
기본 PowerShell 이벤트 로그 명령어
Get-EventLog 명령어

# 사용 가능한 모든 로그 목록 확인
Get-EventLog -List
# 시스템 로그의 최근 10개 이벤트
Get-EventLog -LogName System -Newest 10
# 특정 날짜 이후의 오류 이벤트만 조회
Get-EventLog -LogName System -EntryType Error -After (Get-Date).AddDays(-7)
# 특정 이벤트 ID만 검색
Get-EventLog -LogName System -InstanceId 7000
# 특정 소스의 이벤트만 검색
Get-EventLog -LogName Application -Source "Application Error"
Get-WinEvent 명령어 (Windows Vista 이후)
# 시스템 로그 조회
Get-WinEvent -LogName System
# 보안 로그 조회 (관리자 권한 필요)
Get-WinEvent -LogName Security
# 특정 이벤트 ID 검색
Get-WinEvent -FilterHashtable @{LogName='System'; ID=1074}
# 최근 24시간 오류 이벤트
Get-WinEvent -FilterHashtable @{
LogName='System'
Level=2
StartTime=(Get-Date).AddHours(-24)
}
# 복합 조건 검색
Get-WinEvent -FilterHashtable @{
LogName='System','Application'
Level=1,2
StartTime=(Get-Date).AddDays(-7)
}
실무에서 유용한 PowerShell 스크립트
1. 시스템 오류 분석 스크립트
# SystemErrorAnalysis.ps1
param(
[int]$Days = 7,
[string]$OutputPath = "C:\\Temp\\SystemErrors.html"
)
# 지난 N일간의 시스템 오류 수집
$ErrorEvents = Get-WinEvent -FilterHashtable @{
LogName = 'System', 'Application'
Level = 1, 2 # Critical, Error
StartTime = (Get-Date).AddDays(-$Days)
} | Select-Object TimeCreated, Id, LevelDisplayName, LogName, ProviderName, Message
# 오류별 통계 생성
$ErrorStats = $ErrorEvents | Group-Object Id | Sort-Object Count -Descending
# HTML 보고서 생성
$HTML = @"
<!DOCTYPE html>
<html>
<head>
<title>시스템 오류 분석 보고서</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
.error { background-color: #ffebee; }
.critical { background-color: #ffcdd2; }
</style>
</head>
<body>
<h1>시스템 오류 분석 보고서</h1>
<h2>기간: $(Get-Date).AddDays(-$Days).ToString("yyyy-MM-dd") ~ $(Get-Date).ToString("yyyy-MM-dd")</h2>
<h3>오류 발생 통계</h3>
<table>
<tr><th>이벤트 ID</th><th>발생 횟수</th><th>첫 번째 발생</th></tr>
"@
foreach ($stat in $ErrorStats | Select-Object -First 10) {
$firstOccurrence = ($ErrorEvents | Where-Object {$_.Id -eq $stat.Name} | Sort-Object TimeCreated | Select-Object -First 1).TimeCreated
$HTML += "<tr><td>$($stat.Name)</td><td>$($stat.Count)</td><td>$($firstOccurrence)</td></tr>"
}
$HTML += @"
</table>
<h3>최근 오류 이벤트</h3>
<table>
<tr><th>시간</th><th>ID</th><th>레벨</th><th>로그</th><th>소스</th><th>메시지</th></tr>
"@
foreach ($event in $ErrorEvents | Select-Object -First 50) {
$class = if ($event.LevelDisplayName -eq "Critical") { "critical" } else { "error" }
$message = $event.Message -replace "`n", "<br>" -replace "`r", ""
if ($message.Length -gt 100) { $message = $message.Substring(0, 100) + "..." }
$HTML += "<tr class='$class'><td>$($event.TimeCreated)</td><td>$($event.Id)</td><td>$($event.LevelDisplayName)</td><td>$($event.LogName)</td><td>$($event.ProviderName)</td><td>$message</td></tr>"
}
$HTML += @"
</table>
</body>
</html>
"@
$HTML | Out-File -FilePath $OutputPath -Encoding UTF8
Write-Host "보고서가 생성되었습니다: $OutputPath"
2. 보안 이벤트 모니터링 스크립트
# SecurityMonitoring.ps1
param(
[int]$Hours = 24,
[string]$ComputerName = $env:COMPUTERNAME
)
Write-Host "=== 보안 이벤트 분석 ($Hours 시간) ===" -ForegroundColor Green
# 로그인 실패 이벤트 (4625)
$LoginFailures = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
ID = 4625
StartTime = (Get-Date).AddHours(-$Hours)
} -ErrorAction SilentlyContinue
if ($LoginFailures) {
Write-Host "`n로그인 실패 이벤트: $($LoginFailures.Count)건" -ForegroundColor Red
# IP 주소별 실패 통계
$FailuresByIP = $LoginFailures | ForEach-Object {
if ($_.Message -match "소스 네트워크 주소:\\s+([^\\s]+)") {
$matches[1]
}
} | Group-Object | Sort-Object Count -Descending
Write-Host "IP별 로그인 실패 TOP 5:"
$FailuresByIP | Select-Object -First 5 | ForEach-Object {
Write-Host " $($_.Name): $($_.Count)회" -ForegroundColor Yellow
}
}
# 성공한 로그인 이벤트 (4624)
$LoginSuccesses = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
ID = 4624
StartTime = (Get-Date).AddHours(-$Hours)
} -ErrorAction SilentlyContinue
Write-Host "`n성공한 로그인: $($LoginSuccesses.Count)건" -ForegroundColor Green
# 권한 상승 이벤트 (4672)
$PrivilegeEscalations = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
ID = 4672
StartTime = (Get-Date).AddHours(-$Hours)
} -ErrorAction SilentlyContinue
if ($PrivilegeEscalations) {
Write-Host "권한 상승 이벤트: $($PrivilegeEscalations.Count)건" -ForegroundColor Yellow
}
# 계정 관리 이벤트 (4720, 4722, 4725)
$AccountEvents = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
ID = 4720, 4722, 4725
StartTime = (Get-Date).AddHours(-$Hours)
} -ErrorAction SilentlyContinue
if ($AccountEvents) {
Write-Host "계정 관리 이벤트: $($AccountEvents.Count)건" -ForegroundColor Cyan
$AccountEvents | ForEach-Object {
$action = switch ($_.Id) {
4720 { "계정 생성" }
4722 { "계정 활성화" }
4725 { "계정 비활성화" }
}
Write-Host " $($_.TimeCreated): $action" -ForegroundColor White
}
}
3. 성능 관련 이벤트 분석 스크립트
# PerformanceAnalysis.ps1
param(
[int]$Days = 1
)
Write-Host "=== 성능 관련 이벤트 분석 ($Days 일) ===" -ForegroundColor Green
# 시스템 재시작 이벤트
$Reboots = Get-WinEvent -FilterHashtable @{
LogName = 'System'
ID = 1074, 6008
StartTime = (Get-Date).AddDays(-$Days)
} -ErrorAction SilentlyContinue
Write-Host "`n시스템 재시작/종료 이벤트: $($Reboots.Count)건"
$Reboots | ForEach-Object {
$type = if ($_.Id -eq 1074) { "정상 재시작" } else { "비정상 종료" }
Write-Host " $($_.TimeCreated): $type" -ForegroundColor $(if ($_.Id -eq 1074) { "Green" } else { "Red" })
}
# 서비스 실패 이벤트
$ServiceFailures = Get-WinEvent -FilterHashtable @{
LogName = 'System'
ID = 7000, 7001, 7023, 7026
StartTime = (Get-Date).AddDays(-$Days)
} -ErrorAction SilentlyContinue
if ($ServiceFailures) {
Write-Host "`n서비스 오류 이벤트: $($ServiceFailures.Count)건" -ForegroundColor Red
$ServiceStats = $ServiceFailures | Group-Object ProviderName | Sort-Object Count -Descending
Write-Host "서비스별 오류 통계:"
$ServiceStats | Select-Object -First 5 | ForEach-Object {
Write-Host " $($_.Name): $($_.Count)회" -ForegroundColor Yellow
}
}
# 메모리 관련 경고
$MemoryWarnings = Get-WinEvent -FilterHashtable @{
LogName = 'System'
ID = 2004, 2019, 2020
StartTime = (Get-Date).AddDays(-$Days)
} -ErrorAction SilentlyContinue
if ($MemoryWarnings) {
Write-Host "`n메모리 관련 경고: $($MemoryWarnings.Count)건" -ForegroundColor Yellow
}
# 디스크 관련 오류
$DiskErrors = Get-WinEvent -FilterHashtable @{
LogName = 'System'
ID = 7, 11, 15
StartTime = (Get-Date).AddDays(-$Days)
} -ErrorAction SilentlyContinue
if ($DiskErrors) {
Write-Host "디스크 관련 오류: $($DiskErrors.Count)건" -ForegroundColor Red
$DiskErrors | Select-Object -First 3 | ForEach-Object {
Write-Host " $($_.TimeCreated): $($_.Message.Split("`n")[0])" -ForegroundColor Red
}
}
📈 실무 시나리오별 로그 분석 방법
시나리오 1: 시스템이 갑자기 재부팅되는 문제
분석 절차

# 1. 예기치 않은 종료 이벤트 확인
Get-WinEvent -FilterHashtable @{LogName='System'; ID=6008} |
Select-Object TimeCreated, Message -First 10
# 2. 정상적인 재부팅 이벤트와 비교
Get-WinEvent -FilterHashtable @{LogName='System'; ID=1074} |
Select-Object TimeCreated, Message -First 10
# 3. 하드웨어 오류 이벤트 검색
Get-WinEvent -FilterHashtable @{
LogName='System'
ID=6,7,11,15
StartTime=(Get-Date).AddDays(-7)
} | Select-Object TimeCreated, Id, LevelDisplayName, Message
# 4. 블루스크린 관련 이벤트
Get-WinEvent -FilterHashtable @{LogName='System'; ID=1001} |
Select-Object TimeCreated, Message -First 5
주요 확인 포인트
✅ 이벤트 ID 6008: 예기치 않은 종료
✅ 이벤트 ID 1001: 시스템 오류 (BSOD)
✅ 이벤트 ID 41: 시스템이 제대로 종료되지 않음
✅ 하드웨어 오류: ID 6, 7, 11, 15
✅ 전원 관리: ID 1, 12, 42
시나리오 2: 특정 애플리케이션이 자주 충돌하는 문제
분석 절차
# 1. 애플리케이션 오류 이벤트 검색
Get-WinEvent -FilterHashtable @{
LogName='Application'
ID=1000,1001,1002
StartTime=(Get-Date).AddDays(-30)
} | Where-Object {$_.Message -like "*YourApp.exe*"} |
Select-Object TimeCreated, Id, Message
# 2. .NET 런타임 오류 (해당하는 경우)
Get-WinEvent -FilterHashtable @{LogName='Application'; ID=1026} |
Where-Object {$_.Message -like "*YourApp*"} |
Select-Object TimeCreated, Message -First 10
# 3. Windows Error Reporting 이벤트
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='Windows Error Reporting'
} | Where-Object {$_.Message -like "*YourApp*"} |
Select-Object TimeCreated, Message -First 10
# 4. 애플리케이션별 상세 로그 확인
Get-WinEvent -LogName "Application and Services Logs/YourApp*" -ErrorAction SilentlyContinue
시나리오 3: 보안 침해 의심 상황
분석 절차
# 1. 로그인 실패 패턴 분석
$LoginFailures = Get-WinEvent -FilterHashtable @{
LogName='Security'
ID=4625
StartTime=(Get-Date).AddDays(-1)
}
# IP별 실패 통계
$LoginFailures | ForEach-Object {
if ($_.Message -match "소스 네트워크 주소:\\s+([^\\s]+)") {
[PSCustomObject]@{
Time = $_.TimeCreated
SourceIP = $matches[1]
Account = if ($_.Message -match "계정 이름:\\s+([^\\s]+)") { $matches[1] }
}
}
} | Group-Object SourceIP | Sort-Object Count -Descending
# 2. 의심스러운 로그인 성공 (비정상 시간, 위치)
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4624} |
Where-Object {
$_.TimeCreated.Hour -lt 6 -or $_.TimeCreated.Hour -gt 22
} | Select-Object TimeCreated, Message -First 10
# 3. 권한 상승 이벤트
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4672} |
Select-Object TimeCreated, Message -First 10
# 4. 파일 시스템 접근 감사 (활성화된 경우)
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4656,4663} |
Where-Object {$_.Message -like "*sensitive*"} |
Select-Object TimeCreated, Message -First 10
# 5. 네트워크 로그온 이벤트
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4624} |
Where-Object {$_.Message -like "*로그온 유형:*3*"} |
Select-Object TimeCreated, Message -First 10
시나리오 4: 성능 저하 문제 분석
분석 절차
# 1. 시스템 리소스 관련 경고
Get-WinEvent -FilterHashtable @{
LogName='System'
Level=2,3 # Error, Warning
StartTime=(Get-Date).AddDays(-7)
} | Where-Object {
$_.Message -like "*memory*" -or
$_.Message -like "*disk*" -or
$_.Message -like "*CPU*"
} | Select-Object TimeCreated, Id, Message
# 2. 서비스 시작 지연 이벤트
Get-WinEvent -FilterHashtable @{LogName='System'; ID=7000,7009,7011} |
Select-Object TimeCreated, Message -First 10
# 3. 페이지 파일 관련 이벤트
Get-WinEvent -FilterHashtable @{LogName='System'; ID=2004,2019,2020} |
Select-Object TimeCreated, Message -First 10
# 4. 애플리케이션 응답 없음 이벤트
Get-WinEvent -FilterHashtable @{LogName='Application'; ID=1002} |
Select-Object TimeCreated, Message -First 10
# 5. 작업 스케줄러 실행 지연
Get-WinEvent -LogName "Microsoft-Windows-TaskScheduler/Operational" |
Where-Object {$_.Id -eq 142} |
Select-Object TimeCreated, Message -First 10
🚨 실시간 모니터링 설정
이벤트 구독 및 전달 설정
1. 이벤트 구독 생성
<!-- CriticalEvents.xml -->
<Subscription xmlns="<http://schemas.microsoft.com/2006/03/windows/events/subscription>">
<SubscriptionId>CriticalSystemEvents</SubscriptionId>
<SubscriptionType>SourceInitiated</SubscriptionType>
<Description>중요 시스템 이벤트 모니터링</Description>
<Enabled>true</Enabled>
<Uri><http://schemas.microsoft.com/wbem/wsman/1/windows/EventLog></Uri>
<ConfigurationMode>Normal</ConfigurationMode>
<Delivery Mode="Push">
<Batching>
<MaxLatencyTime>300000</MaxLatencyTime>
</Batching>
<PushSettings>
<Heartbeat Interval="1800000"/>
</PushSettings>
</Delivery>
<Query>
<![CDATA[
<QueryList>
<Query Id="0">
<Select Path="System">*[System[(Level=1 or Level=2)]]</Select>
<Select Path="Application">*[System[(Level=1 or Level=2)]]</Select>
<Select Path="Security">*[System[(EventID=4625 or EventID=4771)]]</Select>
</Query>
</QueryList>
]]>
</Query>
</Subscription>
2. PowerShell 기반 실시간 모니터링
# RealTimeMonitoring.ps1
param(
[string[]]$EventIDs = @(1074, 6008, 4625, 1000, 7000),
[string]$SmtpServer = "smtp.company.com",