로그를 남긴다는 것은 모니터링과 바로 직결되는 이야기이기 때문에 무엇을 남길지는 직접 생각해야한다.
"이 로그가 없다면 문제 발생 시 원인을 파악할 수 있는가?"를 기준 삼기
고려 사항
보안, 민감 정보
- 반드시 로그로 남겨야 하는가?
- 시스템 분석이나 트러블슈팅에 필요한 정보인가?
- 법적 보존 의무가 있는 정보인가?
- 불필요한 정보까지 무조건 남기면 오히려 보안 위험이나 디버깅 방해 요소가 될 수 있다.
- 로그 마스킹 정책
- 대상
- 고객 정보: 개인정보보호법 등 법적 이슈 → 반드시 마스킹
- 애플리케이션 로직: 파라미터, 조건문 분기 확인용
- SQL 쿼리: 성능 튜닝 또는 디버깅 목적으로 기록 가능하지만, 바인딩 값까지 노출할 경우 주의
- 중요성
- 단순 error 레벨로 남겨선 안 되는 실시간 대응 필요한 이벤트는 별도로 알림을 보낼 수 있다. (ex) Slack, 이메일, PagerDuty 등과 연동)
가독성, 디버깅
- 로그 메시지는 누가 보더라도 빠르게 상황을 파악할 수 있도록 작성해야 한다.
- 로그 Convention => 팀원들과 상의
- 분쟁 point
- 사용자 식별자
- RequestBody
- StackTrace
- Info level 몰아주기
- 로그 필드 표준화
- pros: JSON 형식은 키-값으로 구조화 => 로그 집계 시스템 연동 유리
- cons: 가독성, 속도 저하
추천 방식
로그 대상 | 포맷 | 목적 |
---|
파일 로그 (logs/app.log ) | 사람이 보기 쉬운 형식 | CLI, 실시간 tail, 긴급 디버깅 |
시스템 로그 (stdout or logs/structured.json ) | JSON | 수집 시스템 연동, 검색, 대시보드 |
기계가 처리할 로그는 JSON, 사람이 읽을 로그는 단순 텍스트로 구분하는 것이 실무에서 가장 안정적인 전략
로그 파일 Size
- 불필요한 로그를 제외
- 로그 설정
- 로그가 일정 크기를 넘기면 새 파일로 교체 ex) 100MB 단위
- 일정 기간 이상된 로그는 자동 삭제 ex) 7~30일
대상
- request, response
- error, exception
- 사용자 활동 로그(보안 감사 추적. 주로 법적)
- 시스템 상태 로그
- 보안 로그
- Debug(local, dev 환경)
흐름
- Request가 들어오는 Flow는 Filter -> DispatcherServlet -> HandlerInterceptor -> controller 순으로 들어온다.
- Controller로 넘어가기 전에 Interceptor 같은데서 로그?
로그 레벨

Debug
- 상세한 내부 흐름 확인 (운영 환경에는 출력 X)
설정
스프링부트 기준
logback(로깅 프레임워크)
- Appender 분리: 콘솔 vs. 파일 vs. JSON
- RollingPolicy: 파일 사이즈/날짜 기반 로테이션
- Pattern: 로그 포맷 구성 (환경별 다르게)
MDC
- 요청 단위의 traceId, userId 등을 로그마다 자동으로 남기기 위한 ThreadLocal 기반 컨텍스트
ex) Filter, Interceptor, AOP에서 활용
Log Filter / Interceptor
- 모든 HTTP 요청/응답/Exception 등에 대한 로그 필터링 및 MDC 설정
로그 마스킹 / 필터링
- AOP + Regex, 또는 logback 필터에서 직접 처리
=> 개인정보, 패스워드, 토큰 등이 로그에 노출되지 않도록 처리
그 외
- tomcat war 배포 시
- 톰캣은 기본적으로 catalina.out에 System.out/err 로그를 저장
- Spring Boot를 WAR로 배포하면 톰캣의 로깅과 Spring의 로깅이 혼합될 수 있음 → 경계 명확히
- Log Format 및 구조화 (JSON 등)
- 중앙 Logging 시스템 연동
도구
- ELK Stack (Elasticsearch + Logstash + Kibana)
- Prometheus + Grafana + Loki
- CloudWatch / Stackdriver / Datadog / Sentry 등 외부 SaaS
기타
- CheckedException(예외 처리 강제) vs UncheckedException(강제 x)
- UnCheckException 추천. Checked는 throws 지옥...
Reference