로깅
- 로깅: 프로그램 동작시 발생하는 모든 일 (서비스 동작 상태, 장애)을 기록하는 행위
- 서비스 동작 상태: 시스템 로딩, HTTP 통신, 트랜잭션, DB 요청, 의도를 가진 Exception
- 장애: I/O Exception, NullPointException, 의도하지 않은 Exception..
로깅 프레임워크
- SLF4J: 로깅 추상화 라이브러리
- Logback: 로깅 프레임워크
로깅 프레임워크 vs System.out.println()
- 로깅 프레임워크는 출력 형식을 지정할 수 있으며,
- 로그 레벨에 따라 남기고 싶은 로그를 별도로 지정할 수 있음
- 또한 콘솔뿐 아니라 파일이나 네트워크 등 로그를 별도의 위치에 남길 수 있음
package com.example.slf4jpoc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jPocApplication {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
System.out.println("로깅 재밌어!");
System.err.println("이건 에러야!");
}
Logger logger = LoggerFactory.getLogger(Slf4jPocApplication.class);
for (int i = 0; i < 3; i++) {
logger.debug("이건 디버깅임! {}", i);
logger.error("이건 에러임! {}", i);
logger.info("이건 인포임! {}", i);
logger.warn("이건 경고임! {}", i);
logger.trace("이건 트레이스임! {}", i);
}
}
}

로그 레벨
레벨 | 설명 |
---|
Fatal | 매우 심각한 에러. 프로그램이 종료되는 경우가 많음 |
Error | 의도하지 않은 에러가 발생한 경우. 프로그램이 종료되진 않음 |
Warn | 에러가 될 수 있는 잠재적 가능성이 있는 경우 |
Info | 명확한 의도가 있는 에러. 요구사항에 따라 시스템 동작을 보여줄 때 |
Debug | Info 레벨보다 자세한 정보가 필요한 경우. Dev 환경 |
Trace | Debug 레벨보다 자세함. Dev 환경에서 버그를 해결하기 위해 사용 |
예시) 회원가입 시, DB에 동일한 email을 가진 회원이 있을 때, DuplicationException을 던진다면 이 이벤트의 로그는 어떤 레벨을 적용할까?
정답: Info -> 개발자가 의도한 예외이기 때문
로깅 vs 디버깅
- 프로그래밍의 절반은 디버깅
- 디버깅을 할 수 없는 상황에서는 로깅이 최선의 선택
(ex, 구동 중인 서버 환경에서,,)
- 디버깅을 쓸 수 있다면 디버깅을 최대한 활용
SLF4J
- Simple Logging Facade for Java
- 다양한 로깅 프레임워크에 대한 추상화 (인터페이스) 역할
- 따라서 단독으로 사용 불가능
- 최종 사용자가 배포 시 원하는 구현체를 선택
SLF4J의 동작 과정

Bridge
- 다른 로깅 API로의 Logger 호출을 SLF4J API로 연결
- 이전의 레거시 로깅 프레임워크를 위한 라이브러리 여러 개 사용 가능
- Binding 모듈에서 사용될 프레임워크와 달라야 함.
SLF4J API
- 로깅에 대한 추상 레이어 (인터페이스) 제공
- 하나의 API 모듈에 하나의 Binding 모듈
Logback
- SLF4J의 구현체
- Log4J를 토대로 만든 프레임워크
Logback 구조

logback-core
- 다른 모듈을 위한 기반 역할을 하는 모듈
- Appender와 Layout 인터페이스가 이 모듈에 해당함
logback-classic
- logback-core를 가지며 SLF4J API를 구현함
- Logger 클래스가 이 모듈에 속함
logback-access
- Servlet Container와 통합되어 HTTP 액세스에 대한 로깅 기능을 제공
- 웹 애플리케이션 레벨이 아닌 컨테이너 레벨에서 설치되어야 함
Logback - 설정 요소

Logger
- 실제 로깅을 수행하는 구성 요소
- 출력 레벨 조정 (TRACE < DEBUG < INFO < WARN < ERROR)
- 기본 레벨은 Debug
Appender
- 로그 메시지가 출력할 대상 결정
- ConsoleAppender: 로그를 콘솔에 출력
- FileAppender: 로그를 파일에 출력
- RollingFileAppender: 파일을 일정 조건에 따라 따로 저장
Layout
- Encoder(Layout) Appender에 포함
- 사용자가 지정한 형식으로 표현될 로그 메시지를 변환하는 역할
실습 -요구사항
- 테스트, 개발 환경에서는 Info 레벨 로그를 Console에다,
- 프로덕션 환경에서는 Info Warn, Error 레벨 별 로그를 파일로 남겨주세요