장점
1) 로그 레벨로 출력 제어(유연성)
- TRACE / DEBUG: 개발 단계에서 상세한 정보를 볼 때 사용
- INFO: 정상 상태나 중요한 진행 상황을 기록할 때 사용
- WARN / ERROR: 경고나 실제 오류가 발생했을 때 사용
- 운영 환경에서는 보통 DEBUG/TRACE를 끄고(INFO 이상만 출력 등) 필요한 정보만 남기기 때문에, 민감정보 노출과 성능 리스크를 줄일 수 있다.
2) 출력 위치를 설정으로 바꿀 수 있음(관리성)
System.out.println은 기본적으로 콘솔에만 출력되어, 서버 재시작/환경에 따라 기록을 체계적으로 남기기 어렵다.
- 로깅(Logback, Log4j2 등)은 설정만으로 콘솔뿐 아니라 파일/원격 수집 시스템(예: ELK, CloudWatch 등)으로 보낼 수 있다.
- 날짜별 파일 분리(rolling), 용량 기준 압축/보관 기간 관리 등 운영에 필요한 기능을 자동화할 수 있다.
3) 성능 최적화 여지가 큼
println을 많이 호출하면 I/O 비용 때문에 병목이 될 수 있다.
- 로깅은 레벨이 꺼져 있으면 메시지 생성/출력 자체를 건너뛸 수 있고, 비동기 로깅(Async Appender) 같은 설정도 가능하다.
- 파라미터 방식(
log.debug("id={}", id))을 쓰면 불필요한 문자열 결합 비용을 줄일 수 있다.
4) 문제 발생 시 원인 추적이 쉬움
로그에는 보통 아래 정보들을 함께 남길 수 있어, 장애 대응에 유리하다.
- 시간(밀리초 단위)
- 스레드 이름
- 클래스/메서드/라인 정보
- 예외 스택트레이스(
log.error("...", e))