[Spring] 로깅 (Logging)
✅ 개요
프로그램을 만들어 잘 동작하는지 확인하려고
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를 추가하지 않고 사용 가능
- java.util.logging
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
++ 로그는 필요한 정보를 제공해주지만 계속 쌓다보면 시스템 용량이 부족해짐!
따라서 로그가 저장되는 DB에 데이터를 언제 삭제할 것인지 계획을 수립하고 운영해야함
References
https://livenow14.tistory.com/63