CRITICAL
CRITICAL (로그 레벨)
1. 개요
CRITICAL은 소프트웨어 로깅 체계에서 가장 높은 심각도를 나타내는 로그 레벨로, 시스템의 핵심 기능이 완전히 중단되어 서비스 지속이 불가능하거나 데이터의 영구적 손실이 발생한 치명적인 상태를 정의합니다.
일반적인 로깅 프레임워크(Syslog, Log4j, Python logging 등)에서 CRITICAL은 ERROR보다 상위 단계로 분류되며, 이는 단순한 기능 오류를 넘어 시스템 전체의 가용성(Availability)에 직접적인 타격을 주는 상황임을 의미합니다.
용어 정의: 프레임워크에 따라
CRITICAL또는FATAL로 명명되며, 본 문서에서는 이를 동일한 최상위 심각도로 간주하여 설명합니다.
2. 발생 조건 및 정의
CRITICAL 레벨은 시스템이 더 이상 정상적인 동작을 수행할 수 없으며, 즉각적인 인간의 개입 없이는 자동 복구가 불가능한 상황에서 사용합니다.
2.1 사용 기준
- 시스템 전체 중단: 메인 프로세스의 비정상 종료(Crash) 또는 커널 패닉으로 인해 서비스 전체가 중단된 경우.
- 데이터 무결성 파괴: 데이터베이스의 물리적 손상, 복구 불가능한 데이터 유실, 또는 심각한 데이터 오염이 발생한 경우.
- 보안 침해: 관리자 권한 탈취, 핵심 인증 시스템의 붕괴 등 시스템 전체의 보안이 무너진 경우.
- 외부 의존성 완전 상실: 서비스 운영에 필수적인 외부 API나 인프라(Cloud Region 등)가 완전히 다운되어 대체 경로가 없는 경우.
2.2 로그 레벨별 심각도 및 대응 우선순위 비교
| 로그 레벨 | 심각도 | 정의 | 대응 우선순위 | 대응 방식 |
|---|---|---|---|---|
| DEBUG | 최하 | 개발 단계의 상세 정보, 변수 값 확인 | 최하 | 개발 환경에서만 확인 |
| INFO | 하 | 정상적인 상태 변경, 비즈니스 흐름 기록 | 하 | 주기적 모니터링 |
| WARNING | 중 | 잠재적 문제, 성능 저하 징후 (동작은 가능) | 중 | 계획된 유지보수 시 처리 |
| ERROR | 상 | 특정 기능의 실패, 요청 처리 불가 (부분적 장애) | 상 | 담당자 할당 및 수정 |
| CRITICAL | 최상 | 시스템 전체 마비, 데이터 손실 (전면적 장애) | 최상 | 즉각적인 긴급 호출(On-call) |
2.3 FATAL 레벨과의 차이점
많은 시스템에서 CRITICAL과 FATAL을 혼용하지만, 엄격히 구분하는 경우 다음과 같은 차이가 있습니다.
- CRITICAL: 시스템의 핵심 기능이 마비되었으나, 프로세스 자체는 살아있어 로그를 남기거나 일부 진단 기능을 수행할 수 있는 상태. (예: DB 연결 불가로 인한 서비스 불능)
- FATAL: 더 이상 실행을 지속할 수 없어 프로세스가 즉시 종료(Terminate)되어야만 하는 상태. 로그를 남긴 직후 프로그램이 강제 종료됨을 의미합니다. (예: 메모리 부족으로 인한 Segmentation Fault)
2.4 로그 레벨 결정 트리 (Decision Tree)
로그 기록 시 어떤 레벨을 선택해야 하는지에 대한 판단 흐름입니다.
graph TD
A[이벤트 발생] --> B{시스템이 계속 작동하는가?}
B -- 아니오 --> C{데이터 손실이나 보안 침해 등<br/>영구적 피해가 있는가?}
C -- 예 --> D[CRITICAL / FATAL - Irrecoverable]
C -- 아니오 --> E[CRITICAL / FATAL - Recoverable/Halted]
B -- 예 --> F{특정 기능만 작동하지 않는가?}
F -- 예 --> G{사용자에게 영향을 주는가?}
G -- 예 --> H[ERROR]
G -- 아니오 --> I[WARNING]
F -- 아니오 --> J{단순 정보 기록인가?}
J -- 예 --> K[INFO]
J -- 아니오 --> L[DEBUG]
3. 처리 프로세스 및 대응 전략
CRITICAL 로그가 발생하면 이는 '장애(Incident)'로 간주하며, 표준 사고 대응 절차(Incident Response)를 따릅니다.
3.1 표준 대응 절차
- 탐지 및 알림 (Detection & Alerting): 모니터링 도구가
CRITICAL로그를 감지하는 즉시 온콜(On-call) 담당자에게 푸시 알림, SMS, 전화 등으로 전파합니다. - 초동 조치 (Triage): 장애 범위(Blast Radius)를 파악하고, 서비스 전체 중단인지 특정 리전의 문제인지 확인합니다.
- 긴급 복구 (Mitigation): 롤백(Rollback), 서버 재시작, 트래픽 우회(Failover) 등을 통해 서비스 가용성을 최우선으로 확보합니다.
- 원인 분석 및 해결 (Root Cause Analysis): 복구 후 로그와 덤프 파일을 분석하여 근본 원인을 제거합니다.
- 사후 보고 (Post-mortem): 장애 발생 원인과 재발 방지 대책을 문서화합니다.
3.2 모니터링 도구별 알림 설정 예시
- Prometheus/Alertmanager:
expr: count_over_time({level="CRITICAL"}[1m]) > 0- 설정: 즉시 PagerDuty 또는 Slack
#emergency채널로 알림 전송. - ELK Stack (Elasticsearch, Logstash, Kibana):
- Watcher 기능을 사용하여
level: "CRITICAL"필드 발생 시 이메일 및 Webhook 발송. - AWS CloudWatch:
- Metric Filter를 통해 "CRITICAL" 문자열 감지 $\rightarrow$ SNS(Simple Notification Service) $\rightarrow$ 담당자 SMS 전송.
4. 구현 예시
다양한 언어의 표준 로깅 라이브러리에서 CRITICAL (또는 이에 준하는 FATAL) 레벨을 사용하는 방법입니다.
4.1 Python (logging 모듈)
import logging
# 로깅 설정
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
try:
# 핵심 DB 연결 시도
raise ConnectionError("Database cluster is unreachable")
except ConnectionError as e:
# 시스템 전체가 작동 불능인 상태이므로 CRITICAL 사용
logger.critical(f"SYSTEM HALTED: {e}")
# 이후 프로세스 강제 종료 등의 조치 수행
4.2 Java (Log4j2)
Java에서는 FATAL 레벨이 CRITICAL과 동일한 의미로 사용됩니다.
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class SystemManager {
private static final Logger logger = LogManager.getLogger(SystemManager.class);
public void checkSystemHealth() {
if (isDiskFull()) {
// 디스크 풀로 인해 더 이상 쓰기 작업이 불가능한 치명적 상황
logger.fatal("CRITICAL FAILURE: Disk space exhausted. System shutting down.");
System.exit(1);
}
}
}
4.3 Go (slog - Standard Library)
Go 1.21부터 도입된 slog에서는 기본적으로 LevelError가 최상위이나, 커스텀 레벨을 정의하여 CRITICAL을 구현할 수 있습니다.
import (
"log/slog"
"os"
)
// 커스텀 레벨 정의 (LevelError보다 높은 단계)
const LevelCritical = slog.LevelError + 4
func main() {
logger := slog.New(slog.NewTextHandler(os.Stderr, nil))
// 커스텀 레벨을 사용하여 치명적 오류 기록
logger.Log(nil, LevelCritical, "CRITICAL: Memory corruption detected", "status", "unrecoverable")
}
5. 주의사항 및 오남용 사례
5.1 알람 피로 (Alert Fatigue)
가장 빈번하게 발생하는 오남용 사례는 모든 에러를 CRITICAL로 설정하는 것입니다.
- 현상: 사소한 API 타임아웃이나 일시적인 네트워크 지연까지 CRITICAL로 설정하면, 담당자는 하루에도 수십 번의 긴급 알림을 받게 됩니다.
- 결과: 정작 실제 시스템 붕괴 상황이 발생했을 때, 알림을 무시하거나 둔감하게 반응하여 대응 골든타임을 놓치는 '알람 피로' 현상이 발생합니다.
5.2 ERROR와 CRITICAL의 구분 사례
동일한 '결제 실패' 상황에서도 영향 범위에 따라 레벨을 엄격히 구분해야 합니다.
| 상황 | 적절한 로그 레벨 | 이유 |
|---|---|---|
| 특정 사용자의 카드 한도 초과로 결제 실패 | INFO 또는 WARNING |
시스템은 정상이며, 비즈니스 로직에 따른 정상적인 실패임. |
| 결제 게이트웨이(PG사) API의 일시적 응답 지연 | ERROR |
일부 사용자가 불편을 겪지만, 재시도(Retry)를 통해 해결 가능함. |
| 결제 DB의 쓰기 권한 상실 또는 스토리지 완전 파손 | CRITICAL |
모든 사용자의 결제가 불가능하며, 데이터 복구가 시급한 전면적 장애임. |
5.3 CRITICAL 로그 작성 원칙
CRITICAL 로그는 즉각적인 대응을 위한 '단서'가 되어야 합니다. 메시지 작성 시 다음 항목을 반드시 포함하십시오.
- 정확한 발생 시각 및 타임스탬프: 장애 발생 시점의 정확한 기록.
- 영향 범위 (Blast Radius): 어떤 서비스, 어떤 리전, 어떤 사용자 그룹이 영향을 받는지 명시.
- 핵심 리소스 ID: 문제가 발생한 서버 ID, DB 클러스터 이름, API 엔드포인트 등.
- 에러 스택 트레이스 (Stack Trace): 코드의 어느 지점에서 치명적 오류가 발생했는지에 대한 상세 경로.
- 즉시 확인 필요 사항: "DB 커넥션 풀 확인 필요", "S3 버킷 권한 확인 필요" 등 대응자가 즉시 수행해야 할 액션 가이드.
5.4 요약 및 권고
CRITICAL 레벨은 "지금 당장 잠에서 깨어나 서버를 확인해야 하는 상황"에만 사용해야 합니다. 로그 레벨의 엄격한 구분은 운영 효율성을 높이고, 장애 복구 시간을 단축시키는 핵심적인 소프트웨어 엔지니어링 관행입니다.
이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.