로깅의 필요성
- 애플리케이션 디버깅, 문제 해결, 모니터링, 에러 리포트를 위한 필수 도구!
- 예) 디버깅 - 고객의 문제 상황을 개발 환경에서 에러 재현할 수 없는 경우도 있음
디버거 만으로는 한계가 존재 - 로그를 사용하면 로그를 기록하는 상황에 따라 커스터마이징, 정보를 간략하게 혹은 더 상세하게 표시할 수 있게 구성이 가능함
대표적인 로깅 요소
- 에러
- 예상하지 않은 동작 (버그)
- 애플리케이션 변경 추적
- 주요 이벤트 (서비스 / 모듈 시작과 종료, 로그인 등) 알림
- 제대로 서비스가 동작하고 있는지에 대한 정보성 알림
무엇을 기록할 것인가? - 로그 콘텐츠
항목 | 세부 내용 |
Error | 메시지, 스택 추적, 에러 발생 시 애플리케이션이 실행하고 있던 작업 |
Debugging | 디버깅 시 필요한 세부 추적 정보 적용되는 변수 값, 메서드 등 실행에 대한 세부 정보 |
주요 이벤트 | 로그에 저장하고 싶은 중요 이벤트 엔티티 생성, 유저 로그인 성공, 작업 실행 등 |
어디에 기록할 것인가?
1. 콘솔
2. 파일
항목 | 세부 내용 |
콘솔 | 직관적 애플리케이션 종료 혹은 콘솔 버퍼를 초과하면 내용이 휘발될 수 있음 |
파일 | 로그가 휘발되지 않고 저장됨 눈으로 읽기는 쉽지만 프로그래밍처럼 패턴화된 방식으로 필터링해서 보기에는 다른 방법보다 어려움이 따름 |
이메일/문자 (SMTP/SMS) | 즉시 조치를 취해야 하는 등 심각한 오류나 이벤트 시에 관리자에게 알림이 가도록 설정 |
데이터베이스 | 로그 필터링이 쉽고 효율적 파일보다 기록 속도가 느리고 로깅 양이 많을 때 부하가 발생할 수 있지만 NoSQL 데이터베이스 (MongoDB 등)에 저장한다면 대부분의 문제가 해결됨 |
어떻게 기록할 것인가? - 로깅 레벨
- 패키지, 클래스 별로 어느 정도의 정보를 로그로 남길 것인지 설정할 수 있음
- 로그의 내용에 따라 log level을 구분
- Spring Boot에서 쓰이는 로그 프레임워크인 LogBack의 log level
- TRACE < DEBUG < INFO < WARN < ERROR
- 왼쪽으로 갈수록 상세한 수준의 로그, 다음 레벨의 내용을 포함함
- 예)
TRACE 로그 ≫ DEBUG, INFO, WARN, ERROR 로그를 모두 포함
INFO 로그 ≫ WARN, ERROR 로그 모두 포함
항목 | 세부 내용 |
ERROR | 즉시 대응해야 할 에러 레벨 로그 대응하지 않을 경우, 애플리케이션 동작 중지 등 심각한 장애를 겪을 수 있음 |
WARN | 상황에 따라 잠재적으로 위험할 수 있을 때 예외처리 등 |
INFO | 로그에 저장하고 싶은 중요 애플리케이션 이벤트, 운영 참고 정보 |
DEBUG | 개발 단계에서 사용 디버깅이 가능하도록 상세한 내용이 출력됨 |
TRACE | 개발 단계에서 사용 DEBUG 레벨보다 상세 - 모든 레벨 로그가 출력 |
Spring Boot 기본 로깅
- Spring Boot 구동 시 뜨는 로깅
- 애플리케이션 주요 이벤트가 발생할 때마다 로깅이 발생
- 따로 설정을 하지 않아도 됨
- application.properties 파일
- 설정에 따라 logging level을 조정할 수 있음
SLF4J (Simple Logging Facade for Java)
- 다양한 로깅 프레임 워크(java.util.logging, logback 및 log4j)에 대한 추상화(인터페이스) 역할을 하는 라이브러리
- 여러 로깅 프레임워크의 복잡한 기능과 구현 세부 사항 을 숨기고, 일관된 인터페이스를 통해 로깅 기능을 제공
- 인터페이스이므로 단독 사용 불가능
- SLF4J의 간단한 API를 사용하여 로그를 작성하면 됨. 실제 로깅 작업은 선택한 로깅 프레임워크 가 처리
- 즉, 로깅 프레임워크의 내부 구조나 동작 방식을 알 필요 없이 로깅 기능을 사용할 수 있게 됨
- 개발 시 ≫ SLF4J API를 사용하여 로깅 코드를 작성
- 배포 시 ≫
원하는 구현체 선택 (logback, log4j 등)
바인딩된 Logging Framework가 실제 로깅 코드를 수행
SLF4J의 구현체 - Logback
- SLF4J API를 사용하여 로그를 작성하면, 실제 로깅 작업은 Logback이 처리
- springboot starter로 만들어 springboot-web 의존성이 추가되어 있다면 기본적으로 logback 로그 프레임워크 사용 가능
- Spring Boot는 Logback에 대한 기본 설정을 제공하므로, 별도의 설정 없이도 바로 로깅을 시작할 수 있음
- 필요한 경우, 사용자 정의 설정을 통해 로깅 동작을 세부적으로 조절
Logback 설정하기
1. Lombok을 사용한 로깅 어노테이션
- @Slf4j : Lombok 라이브러리가 제공하는 어노테이션으로, 로거(Logger) 객체를 자동으로 생성해줌
- Logger 객체를 수동으로 생성할 필요 없이 로깅 사용 가능 ≫ log.info("")
2. 로깅 사용
- Logger log = LoggerFactory.getLogger(Log.class);
- @Slf4j 어노테이션을 사용하지 않는다면 수동으로 Logger 객체를 생성하여 사용 가능
3. Logback 설정
- 두 가지 방법
- application.properties에서 간단히 설정하는 방법
- logback-spring.xml 파일을 만들어 세부 설정하는 방법
- resource 폴더 밑에 위치해두면 설정을 읽음
4. 기본 logback-spring.xml
** 로깅 결과
5. 파일에 Log 기록하기
** 로깅 결과
6. 주기별로 나눠서 로그 저장하기
'spring' 카테고리의 다른 글
웹 어플리케이션 보안 취약성 (0) | 2024.11.02 |
---|---|
HTTPS vs HTTP (0) | 2024.11.02 |
영속성 전이 (0) | 2024.09.15 |
다대일 단/양방향 매핑 (0) | 2024.09.15 |
연관관계 매핑 종류 / 방향 (0) | 2024.09.15 |