"서버가 다운되고 시스템이 멈췄을 때 가장 치명적인 오류는, 문제를 해결해야 할 로그 뷰어조차 수 기가바이트의 파일 크기를 감당하지 못해 함께 크래시되는 것입니다. 디스크 전체를 메모리에 올리지 않고 델타 오프셋만을 정밀 추적하며, 외부 클라우드로 기밀을 유출하지 않는 온디바이스 진단 엔진—그것이 무중단 공공·국방 인프라의 핵심 방어막입니다."
1. 전산실과 서버 관리자의 악몽: 기가바이트(GB)급 로그 열람 시 메모리 폭발(OOM)과 클라우드 유출 리스크
전국 초·중·고등학교 컴퓨터실 40대 PC의 시스템 운영, AI 디지털교과서(AIDT) 서버 관리, 국방 C4I 및 연구소 인프라 현장에서 시스템 장애가 발생했을 때 엔지니어가 가장 먼저 직면하는 장벽은 로그 파일의 거대한 크기입니다. 서비스가 장시간 구동되며 수백 메가바이트(MB)에서 수 기가바이트(GB)로 누적된 텍스트 로그를 일반 메모장(Notepad)이나 웹 기반 뷰어로 열면 다음과 같은 심각한 문제가 발생합니다:
- Out of Memory (OOM) 및 시스템 프리징: 전체 파일을 인메모리 버퍼에 한 번에 적재하려다 운영체제 메모리가 고갈되어 관리자 PC가 완전히 멈추거나 프로세스가 강제 종료됩니다.
- 파일 공유 락(File Lock) 충돌: 백그라운드 서버 프로세스가 로그를 실시간으로 기록 중일 때, 뷰어가 배타적 잠금(Exclusive Lock)으로 파일을 열면 "다른 프로세스가 사용 중"이라는 에러(Access Denied)와 함께 읽기가 차단됩니다.
- 상용 APM/SaaS 툴의 데이터 유출 리스크: Datadog, Sentry, CloudWatch 등의 클라우드 로깅 서비스를 도입할 경우, 로그 파일 내에 무심코 찍힌 학생 개인정보, 교내망 IP, 군사 작전 파라미터가 외부 상용 클라우드로 전송되어 중대한 보안 컴플라이언스 위반을 초래합니다.
- Windows 이벤트 로그의 파편화: Windows 이벤트 뷰어(eventvwr.msc)는 구동 속도가 극도로 느리고 검색/필터링 조건 지정이 복잡하여, 실시간 장애 추적(데드락, 서비스 충돌)에 즉각 대응하기 어렵습니다.
| 비교 항목 | 전통적 텍스트 에디터 (Notepad 등) | 클라우드 SaaS APM (Datadog/Sentry) | ZeliLog 온디바이스 거버넌스 |
|---|---|---|---|
| GB급 파일 적재 방식 | 전체 파일 메모리 로드 (OOM 크래시) | 외부 에이전트가 클라우드 업로드 | 초기 최근 500줄 로드 + 백그라운드 태스크 |
| 실시간 추적 (Tail) | 불가 (파일 닫고 다시 열어야 함) | 네트워크 지연 5초~수십 초 발생 | 500ms 파일 포인터(Seek) 델타 스트리밍 |
| 파일 락 충돌 방지 | 배타적 잠금 충돌 빈발 | 에이전트 훅킹 오버헤드 | FileShare.ReadWrite 비차단 모드 |
| Windows 이벤트 로그 | 지원 불가 (텍스트 파일만 가능) | 별도 유료 라이선스 및 에이전트 필요 | 5대 채널(App, Sys, Sec 등) 네이티브 통합 |
| 외부 통신량 & 보안 | 0바이트 | 수 GB 네트워크 트래픽 외부 유출 | 완전 0바이트 (Air-Gap 완전 격리) |
ZeliLog는 이러한 현장의 치명적인 병목을 해결하기 위해 개발된 WinUI 3 네이티브 온디바이스 초경량 실시간 로그 & Windows 이벤트 분석기입니다.
2. 500ms 파일 포인터(Seek) 델타 증분 스트리밍 & 트렁케이션 자동 감지
ZeliLog의 핵심 아키텍처는 파일 포인터 오프셋(`_lastPosition`) 기반의 델타 증분 읽기입니다.
전체 파일을 다시 읽지 않고, 직전 읽기 완료 시점의 바이트 오프셋에서부터 새로 추가된 바이트만을 fs.Seek()으로 즉각 읽어옵니다.
// ═══════════════════════════════════════════════════════
// ZeliLog 500ms 델타 파일 스트리밍 파이프라인
// ═══════════════════════════════════════════════════════
private void TailTimer_Tick(object sender, object e)
{
if (_isLoadingFile) return;
if (_currentMode == "file")
{
if (string.IsNullOrEmpty(_filePath) || !File.Exists(_filePath)) return;
try
{
// FileShare.ReadWrite: 다른 프로세스가 로그를 쓰고 있어도 락 충돌 없이 읽기
using var fs = new FileStream(_filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
// [1] 로그 로테이션(Truncation) 감지: 파일 크기가 이전 오프셋보다 작아진 경우
if (fs.Length < _lastPosition)
{
_lastPosition = 0;
LogListView.Items.Clear();
}
if (fs.Length == _lastPosition) return; // 새로운 로그 없음
// [2] 직전 위치로 고속 Seek 후 신규 바이트만 스트리밍
fs.Seek(_lastPosition, SeekOrigin.Begin);
using var sr = new StreamReader(fs);
string newContent = sr.ReadToEnd();
_lastPosition = fs.Length; // 포인터 갱신
// [3] 줄 단위 파싱 및 필터링 적용
var newLines = newContent.Split('\n')
.Select(l => l.TrimEnd('\r'))
.Where(l => !string.IsNullOrEmpty(l));
foreach (var line in newLines)
{
if (ShouldShow(line)) AddLogLine(line);
}
// [4] 메모리 누수 방지 FIFO 캡핑 (최대 5,000줄 보존)
while (LogListView.Items.Count > 5000) LogListView.Items.RemoveAt(0);
TxtLineCount.Text = string.Format(Loc.Get("Log_LinesShowing"), LogListView.Items.Count);
if (ChkAutoScroll.IsChecked == true) ScrollToBottom();
}
catch { }
}
}
이 방식은 파일의 전체 용량이 10GB에 달하더라도 초당 수 바이트~수 킬로바이트 수준의 신규 증분만을 읽어들이므로, CPU 점유율은 0.1% 미만으로 유지되며 디스크 I/O 병목이 발생하지 않습니다.
또한 로그 로테이션(Log Rotation)으로 파일이 비워지거나 새 파일로 교체되는 상황(fs.Length < _lastPosition)을 0초 만에 감지하여 뷰와 오프셋을 자동 동기화합니다.
3. Windows 5대 핵심 이벤트 로그 실시간 수집 및 하이브리드 ETW 폴백
단순 텍스트 파일 외에도, 운영체제 커널 및 윈도우 서비스 장애를 진단하기 위해서는 Windows 이벤트 로그 분석이 필수적입니다.
ZeliLog는 클래식 EventLog API와 최신 ETW(Event Tracing for Windows) 기반의 EventLogReader를 지능적으로 결합한 하이브리드 이벤트 엔진을 탑재했습니다.
// 5대 핵심 채널: Application, System, Security, Setup, Windows PowerShell
private void LoadEventLog(string logName)
{
LogListView.Items.Clear();
_allLines.Clear();
// [1] Security 로그 관리자 권한 사전 검증 및 UAC 안내
if (logName == "Security" && !IsRunningAsAdmin())
{
TxtStatus.Text = "❌ " + Loc.Get("Log_SecurityNeedsAdmin");
AddLogLine("⚠️ " + Loc.Get("Log_SecurityAdminHint"));
AddLogLine(" → " + Loc.Get("Log_SecurityAdminInstruction"));
return;
}
// [2] Setup 등 ETW 전용 채널은 EventLogReader로 즉시 분기
if (logName == "Setup" || logName == "ForwardedEvents" || !EventLog.Exists(logName))
{
LoadEventLogViaReader(logName);
return;
}
// [3] Classic EventLog API: 최근 300개 항목 역순 로드
var eventLog = new EventLog(logName);
var entries = eventLog.Entries;
int count = entries.Count;
_lastEventIndex = count; // 이벤트 Tail 기준점 설정
int start = Math.Max(0, count - 300);
for (int i = count - 1; i >= start; i--)
{
var entry = entries[i];
string line = $"[{entry.TimeGenerated:yyyy-MM-dd HH:mm:ss}] [{entry.EntryType}] " +
$"[{entry.Source}] {entry.Message?.Replace("\r\n", " ")}";
if (ShouldShow(line)) AddLogLine(line);
}
}
특히 보안 감사(Security) 로그는 일반 계정 권한으로 접근 시 윈도우 보안 정책에 의해 차단되므로, WindowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator) 검증을 사전 수행하여 친절한 관리자 권한 승격 가이드를 제공합니다.
또한 이벤트 로그 Tail 모드 구동 시 _lastEventIndex를 추적하여 3초 주기로 신규 등록된 커널 이벤트만을 UI에 즉시 반영합니다.
4. 정규식(Regex) 실시간 필터링 & 지능형 심각도 컬러 하이라이팅
수만 줄의 로그 속에서 장애의 원인을 규명하기 위해서는 초단위 검색과 직관적인 시각화가 필수적입니다.
ZeliLog는 AutoSuggestBox와 정규식 파서를 결합하여, 사용자가 정규식 패턴을 입력하면 즉각 매칭을 수행하고, 잘못된 문법일 경우 일반 문자열 검색으로 자동 폴백(Fallback)하는 안전망을 구축했습니다.
// ── 정규식 및 대소문자 무시 검색 안전망 ──
private bool ShouldShow(string line)
{
if (string.IsNullOrEmpty(_filterPattern)) return true;
try { return Regex.IsMatch(line, _filterPattern, RegexOptions.IgnoreCase); }
catch { return line.Contains(_filterPattern, StringComparison.OrdinalIgnoreCase); }
}
// ── 심각도(Severity) 기반 직관적 컬러 브러시 바인딩 ──
private void AddLogLine(string line)
{
var tb = new TextBlock
{
Text = line,
FontFamily = new FontFamily("Consolas"),
FontSize = 12,
IsTextSelectionEnabled = true
};
if (ChkHighlight.IsChecked == true)
{
string lower = line.ToLowerInvariant();
if (lower.Contains("[error]") || lower.Contains("exception") ||
lower.Contains("fatal") || lower.Contains("critical"))
{
tb.Foreground = new SolidColorBrush(Color.FromArgb(255, 248, 113, 113)); // 네온 레드
}
else if (lower.Contains("[warning]") || lower.Contains("warn"))
{
tb.Foreground = new SolidColorBrush(Color.FromArgb(255, 251, 191, 36)); // 앰버 옐로우
}
else if (lower.Contains("[info]") || lower.Contains("information"))
{
tb.Foreground = new SolidColorBrush(Color.FromArgb(180, 255, 255, 255)); // 소프트 화이트
}
else { tb.Opacity = 0.7; }
}
LogListView.Items.Add(tb);
}
에러와 예외 스택 트레이스는 시인성이 극대화된 네온 레드(#f87171)로 자동 착색되며, 고정폭 폰트(Consolas)와 텍스트 드래그 선택 복사 기능을 지원하여 긴 시스템 전문도 흐트러짐 없이 직관적으로 판독할 수 있습니다.
5. 폐쇄망(Air-Gap) 완전 격리 포렌식: 제로 텔레메트리의 원칙
군사 작전 전산망, 국가 시험 출제 본부, 교육행정정보시스템(NEIS) 연계 서버의 로그에는 시스템 내부 IP 주소, 열린 포트 번호, 사용자 계정 ID, 비정상 쿼리 전문 등이 고스란히 담겨 있습니다. 이러한 로그 파일이 상용 모니터링 툴의 분석 모듈을 거쳐 외부 클라우드로 전송되는 순간, 그것은 치명적인 국가 기밀 및 개인정보 누출 사고가 됩니다.
ZeliLog는 단 1바이트의 외부 네트워크 통신도 발생시키지 않는 완전 격리 온디바이스 원칙을 엄수합니다.
로컬 하드디스크의 FileStream과 로컬 Windows 커널의 EventLog 프로바이더만을 직접 조회하므로, 물리적으로 인터넷 케이블이 분리된 폐쇄망 환경에서도 100% 정상 작동하며 포렌식 감사의 무결성을 완벽하게 보장합니다.
6. 결론: 국가 교육망과 국방 서버 인프라의 장애 0초 격리를 위한 미래
ZeliLog는 무거운 외부 소프트웨어나 복잡한 클라우드 구성 없이도, 단 하나의 경량 도구로 시스템의 모든 징후를 0초 만에 추적할 수 있음을 입증합니다.
- ZeliProc(#925)과의 프로세스-로그 협업: ZeliProc에서 델타 CPU 샘플링으로 발견된 이상 고부하 프로세스를 즉시 ZeliLog로 연계하여, 해당 프로세스가 남긴 실시간 오류 로그를 0초 만에 동기화 추적.
- ZeliScan(#944)과의 보안 이벤트 결합: 비인가 포트 접속이나 USB 연결 감지 시 Windows Security 이벤트 로그와 즉각 상관분석을 수행하는 온디바이스 포렌식 파이프라인 확립.
- 차세대 멀티 파일 동시 Tail 확장: 마이크로서비스 아키텍처 환경에서 여러 개의 로그 파일을 탭 분할 및 시간순 병합(Merge)하여 타임라인 형태로 시각화하는 멀티 스트림 엔진 추가 계획.
거대한 로그의 홍수 속에서 단 한 줄의 핵심 원인을 가장 빠르고 안전하게 찾아내는 기술—ZeliDesk가 온디바이스 시스템 거버넌스를 통해 완성해 나가는 견고한 엔지니어링 표준입니다.