실무용 로그 전략 핵심 요약
| 전략 | 목적 |
| 로그 레벨 분리 | 정보 vs 문제를 명확히 구분 |
| 로그 포맷 통일 | 로그 분석 도구와 연동 가능하게 |
| 요청 단위 추적 | 한 요청의 흐름을 모두 추적 |
| 민감 정보 제거 | 개인정보 보호 및 보안 |
| 외부 전송 (ELK 등) | 중앙 로그 수집 및 검색 |
| 파일 회전 및 압축 | 디스크 절약 + 이력 보존 |
🔹 1. 로그 레벨 전략
| 레벨 | 사용 예시 |
| TRACE | 진짜 미세한 디버깅 (루프 내부 등) |
| DEBUG | 내부 상태 확인 (요청 파라미터, 쿼리 등) |
| INFO | 정상 흐름 기록 (로그인 성공, 주문 완료 등) |
| WARN | 문제 가능성 (재시도 발생, 응답 지연 등) |
| ERROR | 예외 발생, 서비스 실패 등 (장애 분석의 핵심) |
🧠 운영 환경에서는 INFO, WARN, ERROR 중심으로 사용
📦 로그 분석 도구에서 레벨별 필터링 가능해야 함
🔹 2. 공통 로그 포맷 지정 (JSON, 텍스트 등)
예시 포맷 (텍스트)
[2025-03-28 10:12:45.678] [INFO ] [OrderService] [orderId=12345 userId=7] 주문 생성 완료
예시 포맷 (JSON)
{
"timestamp": "2025-03-28T10:12:45.678Z",
"level": "INFO",
"service": "order-service",
"message": "주문 생성 완료",
"orderId": 12345,
"userId": 7,
"traceId": "abc123"
}
💡 ELK, CloudWatch, Datadog 등과 연동하려면 **구조화된 로그(JSON)**가 유리합니다.
🔹 3. 요청 단위 추적 (트레이싱, Mapped Diagnostic Context)
- 하나의 요청이 어떤 로그들을 남겼는지 추적하려면 TraceId, RequestId, userId 같은 걸 로그에 포함시켜야 함
- Spring Boot에서는 [MDC (Mapped Diagnostic Context)]를 사용해서 해결 가능
import org.slf4j.MDC;
MDC.put("traceId", "abc123");
log.info("상품 조회 요청");
MDC.clear(); // 꼭 지워줘야 다른 요청에 영향 X
📌 Spring Cloud Sleuth, Zipkin, OpenTelemetry 등을 함께 쓰면 자동 추적 가능!
🔹 4. 민감 정보 로깅 금지
절대 로그에 담으면 안 되는 정보:
- 비밀번호, 주민번호, 카드번호, 계좌번호
- 인증 토큰, 세션 ID, 쿠키
✅ 가능하면 로그 필터 설정 (LogFilter, AOP 등)으로 필터링 처리
🔹 5. 로그 파일 전략 (회전 + 압축 + 보관)
Logback 설정 예:
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
- 매일 새 파일 생성
- 압축 보관 (.zip)
- 30일 지나면 삭제
🔹 6. 중앙 로그 수집 (ELK, CloudWatch, Grafana Loki)
서버 여러 대의 로그를 하나의 대시보드에서 검색, 분석
- ELK (Elasticsearch + Logstash + Kibana) → 실시간 분석
- Grafana Loki → 로그 중심 시각화
- AWS CloudWatch Logs → 클라우드 환경에 적합
- 로그는 Logstash, Fluentd, Filebeat로 수집
🔹 7. AOP 기반 요청-응답 로그 남기기
@Around("execution(* com.myapp.controller..*(..))")
public Object logRequest(ProceedingJoinPoint joinPoint) throws Throwable {
String traceId = UUID.randomUUID().toString();
MDC.put("traceId", traceId);
log.info("→ {} called with {}", joinPoint.getSignature(), Arrays.toString(joinPoint.getArgs()));
Object result = joinPoint.proceed();
log.info("← {} returned {}", joinPoint.getSignature(), result);
MDC.clear();
return result;
}
✅ 실무용 로그 전략 정리 표
| 항목 | 전략 |
| 로그 레벨 | 개발은 DEBUG, 운영은 INFO 이상 |
| 포맷 | 통일된 포맷 (JSON 또는 표준 텍스트) |
| 요청 추적 | traceId, MDC, Sleuth, Zipkin |
| 보안 | 민감 정보 로그 금지, 마스킹 |
| 저장 | 로그 파일 회전 + 압축 + 보관 기간 설정 |
| 분석 | ELK, Grafana, CloudWatch 연동 |
| 자동화 | AOP로 HTTP 요청/응답 자동 로그 남기기 |