관리 메뉴

JIE0025

[Spring] 로깅 (Logging) 본문

백엔드/스프링, 스프링부트, JPA, Spring Webflux

[Spring] 로깅 (Logging)

Kangjieun11 2022. 12. 22. 19:19
728x90

 

✅  개요

프로그램을 만들어 잘 동작하는지 확인하려고

System.out.println()도 많이 썼다.

또 디버깅을 통해 데이터의 흐름도 볼수있었다. 

이런것들은 다 로그의 하나로 볼수있다. 

 

 

그럼 로깅은 뭘까? 로깅은 운영중인 웹 어플리케이션의 문제 발생시- 원인을 파악하기 위한 정보를 의미한다. 

 

배포환경에서도 잘 되는지 확인하기 위해 결국 로깅을 알아야한다. 

 

 

✅  로깅이란? 

프로그램동작시 발생하는 모든 일기록하는 행위

 

⏺ 모든 일   ::  개발자가 가져야하는 최소한의 목적

✔️ 서비스의 동작상태 확인

  • 시스템로딩
  • http통신
  • 트랜잭션
  • db 요청
  • 의도를 가진 Exception

 

✔️ 장애

  • i/o exception
  • nullpointerexception...

 

 

⏺ 로그의 장점

  • 출력형식 지정가능
  • 로그레벨에 따라 남기고싶은 로그를 별도 지정가능
  • 콘솔뿐 아니라 파일, 네트워크 등 별도의 위치에 남길 수 있음

 

  • 실제 서비스에선 로깅 프레임워크가 사용된다.

 

 

⏺ 로깅하는방법

  • System.out.println()
  • 로그 라이브러리/프레임워크 >>> 확장 용이/ 쉬운 설정 
    • java.util.logging
      • JDK 1.4부터 포함된 표준 로깅 API
      • 별도 라이브러리 추가 불필요
      • 기능이 많이 부족해 다른 로그 라이브러리를 많이 사용
    • Apache Commons logging
      • 아파치 재단의 Commons 라이브러리 중에 로그 출력을 제공하는 라이브러리
    • Log4j
      • 아파치 제단에서 제공하며 가장 많이 사용되는 로깅 라이브러리
    • Logback
      • Log4j를 개발한 Ceki Gulcu가 Log4j의 단점 개선 및 기능을 추가하여 개발한 로깅 라이브러리
      • Slf4j의 구현체로 Spring Boot에서는 spring-boot-starter-logging안에 기본적으로 포함되어 있어서 따로 dependency를 추가하지 않고 사용 가능

 

 

SLF4J(Simple Logging Facade for Java

많은 로그 라이브러리를 통합적인 인터페이스로 제공 

 

 

  • 다양한 로깅 프레임웍을 같은 API를 사용해서 접근할 수 있도록 해주는 추상화 계층
  • 실무에서는 Logback을 대부분 사용한다고 한다.
  • 왜냐면!?  위에서도 언급했듯  스프링 부트에서는 기본적으로 SLF4J, Logback을 채택하고 있기 떄문

 

 

 

 

로그의 레벨

TRACE > DEBUG > INFO > WARN > ERROR > FATAL

 

 

✔️ 개발자가 의도하지 않은 예외

FATAL: 아주 심각한 에러, 어플리케이션 작동 불가 (프로그램 종료되는 경우가 많음) -> ERROR레벨로 대체 가능하다.

ERROR: 요청 처리중 문제 (의도하지 않은 에러발생- 프로그램이 종료되지는 않는다.)

------------------------------------------------------------------------

✔️ 의도한 예외 

WARN: 에러가 될 수 있는 잠재적 가능성 있음 //  처리 가능한 문제, 향후 문제가 될수 있는 것 -> INFO레벨로 대체 가능

INFO: 상태변경과 같은 정보성 메시지 *명확한 의도가 있는 에러, 요구사항에 따라 시스템 동작을 보여줄 때

DEBUG: 프로그램 디버깅 (Info보다 더 자세한 정보가 필요한 경우)

TRACE: DEBUG보다 상세한 정보 -> 개발시에 필요하고 DEBUG로 대체 가능 > 개발 환경에서 버그를 해결하기 위해 사용함

 

 

 

 

 로그 사용방법

 

Spring boot에서는 기본적으로 로그 설정이 되어있어서 application.yml(properties)에도 설정이 가능

  • 기본 레벨은 INFO 레벨로 설정되어 있다.
  • root : 전체 범위 레벨 설정
  • 패키지별로도 레벨 범위 설정 가능 (아래사진 참조)  

 

⏺ lombok의 @Slf4j 어노테이션 사용 (자동으로 설정된 log 객체를 사용)

 

 

 

 

⏺   Simple Logging Facade for Java (SLF4J)

인터페이스 역할 (추상로깅프레임웤이라 단독으로 사용불가능, 최종 사용자가 배포시 원하는 구현체를 선택)

SLF4J를 사용하는 클라이언트에선 실제 구현을 몰라도 된다.  (OCP/개방폐쇄, DIP/의존관계역전)

 

개발할 때 : SLF4J API 를 사용해 로깅 코드 작성

배포할 때 : 바인딩된 logging framework가 실제 로깅코드 수행

 

Bridge, SLF4J API, Binding 모듈을 통해 수행될 수 있다. 

 

 

 

 

사용방법은 여기에 아주 잘 나와있으니 나중에 사용할 일이 있으면 참고하자 ^^

https://livenow14.tistory.com/63

 

[Logging] SLF4J란?

블로그를 작성하고, 테코톡을 진행했어요. 더 쉽게 이해하고 싶다면 아래 영상을 시청해주세요! [10분 테코톡] ☂️ 검프의 Logging(로깅) #1 SLF4J(Simple Logging Facade for Java)는 이름에서 확인할 수 있듯

livenow14.tistory.com

 

 

 

 

++ 로그는 필요한 정보를 제공해주지만 계속 쌓다보면 시스템 용량이 부족해짐!

따라서 로그가 저장되는 DB에 데이터를 언제 삭제할 것인지 계획을 수립하고 운영해야함

 

 

 


References

 

https://livenow14.tistory.com/63

https://youtu.be/1MD5xbwznlI

https://dahliachoi.tistory.com/41

https://primetime.tistory.com/entry/Spring-Boot-%EB%A1%9C%EA%B7%B8-%EA%B4%80%EB%A6%AC-logback%EA%B3%BC-Slf4j