로그

Logs are the single source of truth for what actually happened inside the system.

— 분산 인프라 아키텍처 공학 협회에서 정립한, 시스템 추적성과 포렌식 사후 역추적 검증을 위한 영구 불변의 증적 장부 정의

평소에는 텍스트 용량만 처먹는 쓸데없는 휴지 조각 취급을 받지만, 실무 운영 서버가 다운되는 대참사 당일 아침에는 아기 예수 버금가는 구세주 독점 증거물로 대우받는 블랙박스. 하지만 아무런 일관성 규칙 없이 '대충 여기까지 옴', '제발 이쪽 분기 타야 됨' 같은 초보 개발자용 무지성 콘솔 프린트로 가득 차는 순간 소음 공해 유발 쓰레기더미(...)

1. 개요

프로그램이 작동하면서 발생하는 주요 이벤트(유저 로그인 성공, 결제 트랜잭션 수립, 데이터베이스 통신 완료 등)와 감지된 예외 에러 내역들을 날짜와 시간 마이크로초 단위 정보와 결합하여 파일 시스템이나 클라우드 원격 저장소에 순차적으로 기록해 둔 디지털 영구 장부이자 블랙박스. 시스템 고장 사후 분석의 유일무이한 증적 유물 역할을 수행한다.

2. 로깅 레벨(Logging Level)의 우아한 계급 장착

아무 텍스트나 사방에 출력하면 시스템은 로그 소음 공해에 질식해 버린다. 이 때문에 프로페셔널 아키텍트들은 유서 깊은 로깅 레벨(Logging Level) 5대 계급을 엄격히 조율하여 로깅한다.

  1. DEBUG: 개발 단계에서 변수 값을 들여다보는 아주 시시콜콜하고 정밀한 보조용 정보.
  2. INFO: 유저 로그인 성공, 서버 부팅 완료 등 안심하고 일상적으로 정상 수리되는 이벤트 정보.
  3. WARN: 비정상적인 접근 감지, 데이터 임시 손실 우려 등 지금 당장 터지진 않았으나 조만간 사고로 번질 수 있으니 경고하는 신호.
  4. ERROR: 데이터베이스 연결 끊김, 결제 런타임 폭사 등 시스템 일부분이 오작동을 터트려 즉시 엔지니어가 수리해야 하는 심각한 골칫거리.
  5. FATAL/CRITICAL: 아예 데이터 전체가 유실되거나 서버 프로세스가 통째로 심장마비 폭사해 긴급 소방 헬기(?)를 띄워야 하는 재난적 상태.

3. 콘솔 프린트는 버려라: Logback과 Winston의 분산 구조

주니어 시절 버릇대로 서버 코드에 무심코 console.log()System.out.println()을 남발하는 행위는 실무 인프라에서 대역죄로 다뤄진다.(...) 콘솔 창에 텍스트를 실시간 뿌리는 작업은 OS 하드웨어 동기(Synchronous) I/O 통신 인터셉트 리소스를 심각하게 잡아먹어 전체 API 처리 속도를 몇 배로 느리게 갉아먹기 때문이다. 대신 고수들은 Logback(자바 스프링), Winston(자바스크립트 node) 같은 전문 비동기 로깅 프레임워크를 심어 가동한다. 이들은 백그라운드 큐를 이용해 로그 파일 작성을 완전히 비동기로 처리하며, 로그 파일 크기가 기가바이트를 넘어가기 전에 자동으로 압축 분할하고(Log Rotation), 더 나아가 클라우드 중앙 수집소로 안전하게 패킷 송출해 보장한다.1

4. 관련 밈 및 드립

4.1. 사라진 로그와 귀신 고칼로리 밈

사내 서비스에 기괴한 간헐적 금융 예외 버그가 자꾸만 감지되어 사후 역추적 수사를 하려고 밤새 서버 로그를 켰는데, 하필이면 딱 그 에러가 터졌던 시간 0.1초 구간의 로그만 귀신이 고칼로리 장난을 친 듯 하얗게 누락 누출되어 비어 있는 끔찍한 실무 괴담이다. 전산실에서는 '악령이 잡히지 않으려고 내 결제 로그 DB를 마법으로 증발시킨 게 분명하다'며 모니터 앞에서 울부짖는 밈이 통용된다.(...)

5. 여담

  • ELK 스택이라는 거대 공룡: 서버가 수십 수백 대로 늘어나면, 각 서버에 원격 접속해서 텍스트 파일을 뒤지는 행위는 불가능해진다. 현대 기업들은 로그 수집기(Logstash), 분산 데이터베이스 저장소(Elasticsearch), 이를 화면에 구글 검색 엔진처럼 띄워주는 검색기(Kibana)를 엮어 거대 중앙집중식 모니터링 포털인 ELK 스택을 수립해 일괄 통합 감시하고 있다.
  • 로그 대량 폭발로 하드 폭사: 로깅 레벨 설정을 실수로 DEBUG로 맞춰둔 채 운영 서버를 무심코 배포하면, 매초 수백만 번의 유저 접속 핑퐁 트래픽이 쏟아지며 수백 기가바이트(GB)짜리 로그 텍스트 파일이 한 시간 만에 로컬 하드 드라이브 디스크를 꽉 채워 터트려 버린다. 결국 서버 자체가 강제 종료 사망하며 폭사하는 웃픈 자멸 참사가 실무에서 종종 발생한다.
  • 로그 포이즈닝(Log Poisoning) 보안 취약: 해커가 입력값 필드에 악의적인 줄 바꿈 코드( )나 스크립트 명령어를 믹싱해 보내면, 서버 로그 장부에 침투해 '정상적인 로그인 성공' 로그를 위조로 찍거나 로그 뷰어 런타임을 역으로 원격 조작해 해킹하는 무시무시한 로그 포이즈닝 보안 구멍이 유구히 경계되고 있다.

6. 관련 문서

각주

  1. 실제로 이 분산 환경의 로그를 추적하기 위해 백엔드에서는 하나의 유저 요청이 여러 서버를 건너 다닐 때 동일한 트래킹 ID 값을 로그마다 통일해서 헤더에 박고 다니는 '상관관계 ID(Correlation ID)' 추적 기법을 엔지니어링 필수로 활용하고 있다.