본문 바로가기

spring

로깅(Logging)

 

로깅의 필요성
  • 애플리케이션 디버깅, 문제 해결, 모니터링, 에러 리포트를 위한 필수 도구!
  • 예) 디버깅 - 고객의 문제 상황을 개발 환경에서 에러 재현할 수 없는 경우도 있음
    디버거 만으로는 한계가 존재
  • 로그를 사용하면 로그를 기록하는 상황에 따라 커스터마이징, 정보를 간략하게 혹은 더 상세하게 표시할 수 있게 구성이 가능함

대표적인 로깅 요소

  • 에러
  • 예상하지 않은 동작 (버그)
  • 애플리케이션 변경 추적
  • 주요 이벤트 (서비스 / 모듈 시작과 종료, 로그인 등) 알림
  • 제대로 서비스가 동작하고 있는지에 대한 정보성 알림

 

무엇을 기록할 것인가? - 로그 콘텐츠
항목 세부 내용
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