로깅?
프로그램 동작 시 발생하는 모든 일을 기록하는 행위다.
모든 일? 기록?
애매모호하다.
모든 일 (최소한의 목적)
서비스 동작 상태
- 시스템 로딩
- HTTP 통신
- 트랜잭션
- DB 요청
- 의도를 가진 Exception
장애(Exception, Error)
- I/O Exception
- NullPointException
- 의도하지 않은 Exception
로깅은 언제 할까?
나 메이플 직업 추천해줘 같은 질문 같다.
답이 없다는 뜻
프로젝트 성격에 맞게, 팀에 맞게, 로깅 시점은 때에 따라 다르다.
기록
- 로깅 프레임 워크를 알기전에 쓰던 방식
- System.out.println("로깅")
- System.err.println("로깅 에러")
- 로깅 프레임 워크
- Log4J...
- Log4J2도 있음
- JUL
- 자바 정식 로깅 프레임워크
- 근데 잘 안씀
- 로깅 프레임 워크가 Log4J 가 먼저 나왔는데 이게 개발자들이 엄청 많이 썼음
- 그래서 자바측에서도 만들었는데
- 로그 레벨 단위가 달라서 안쓰게 됨!!
- LogBack...
- Log4J...
로그 레벨?
레벨 | 설명 | 추가 설명 |
Fatal | 매우 심각한 에러 프로그램이 종료되는 경우가 많음 | 작성되지 않는 경우가 생길 수 있어서 잘 작성하지 않음 |
Error | 의도하지 않은 에러가 발생한 경우. 프로그램이 종료되진 않음 | 주로 외부 API 요청에서 오류가 발생할 때 → 프로그램 내에서 개발자가 의도하지 않은 예외를 나타낼 때 사용 |
Warn | 에러가 될 수 있는 잠재적 가능성이 있는 경우 | 알람을 통해 개발자가 크리티컬한 에러를 맞닥트리기전 해결할 수 있는 경우 |
Info | 명확한 의도가 있는 에러, 요구사항에 따라 시스템 동작을 보여줄 때 | 개발자가 의도한 에러를 파악할 때 |
Debug | Info 레벨보다 더 자세한 정보가 필요한 경우. Dev 환경 | 주로 Develop 환경에서 사용함 |
Trace | Debug 레벨보다 더 자세함. Dev 환경에서 버그를 해결하기 위해 사용 | Debug보다 더 자세한 예외 로그를 확인할 때 사용 |
로깅 프레임 워크
출력 형식을 지정할 수 있음
로그 레벨에 따라 남기고 싶은 로그를 별도로 지정할 수 있다
콘솔뿐만 아니라 파일이나, 네트워크등 로그를 별도에 위치에 남길 수 있음
로깅 vs 디버깅
디버깅을 할 수 없는 상황에서는 로깅이 최선의 선택이다
디버깅을 쓸 수 있는 환경이면 디버깅을 활용하는 게 맞음
SLF4J
Simple Logging Facade For Java
다양한 로깅 프레임워크에 대한 추상화(인터페이스) 역할
추상 로깅 프레임워크이기에 단독으로 사용 불가능
최종 사용자가 배포시 원하는 구현체를 선택
로깅 프레임
SLF4J 를 의존하는 클라이언트 코드에서는 실제 구현을 몰라도 됨
개방 폐쇄 원칙 의존관계 역전원칙이 잘 지켜진 거라 볼 수 있다.
개발 할 때 - SLF4J 로깅 코드를 작성
배포 할 때 - 바인딩된 로깅 프레임 워크가 실제 로깅 코드를 수행
기존까지 @SLF4J로 로그를 찍었었는데 바인딩 된 로깅 프레임 없는데 왜 됐었냐?
Logback이 spring-boot-starter-web 에 기본으로 들어있기 때문이다.
쨋든
Bridge
다른 로깅 API로의 Logger 호출을 SLF4J API로 연결
이전의 레거시 로깅 프레임워크를 위한 라이브러리
여러개 사용하는 Binding 모듈에서 사용될 프레임워크와 달라야함, 일종의 어댑터 역할을 한다.
SLF4J
로깅에 대한 추상 레이어(인터페이스) 제공
하나의 API 모듈에 하나의 Binding 모듈
Binding
SLF4J API를 로깅 구현체 (Logging Framework) 와 연결하는 일종의 어댑터 역할, 하나의 API 모듈에 하나의 Binding 모듈을 연결해야한다.
public class WonowApplication {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(WonowApplication.class); // 사용법
// 자동으로 Log Level을 Debug로 잡아줌
// 그래서 Trace는 출력 되지 않음
for(int i = 0; i < 5; i++) {
logger.error("에러 {}", i)
logger.warn("워닝 {}", i)
logger.info("인포 {}", i)
logger.debug("디버그임 {}", i)
logger.trace("트레이스임 {}", i) // 출력안됨
logger.trace("트레이스임" + i) // 출력은 안되는데 + 연산은 들어가서 성능이 안좋아짐 그래서 위와 같이 사용하는 게 좋음
}
}
}
디버그 레벨 이상 말고 로그 레벨에 따라 따르게 설정하고 싶으면 xml에 작성하면 된다.
자세한 내용은 추후 Logback 에서 작성하겠다.
'TIL' 카테고리의 다른 글
TIL 2024-01-29 로그 MDC (0) | 2024.01.29 |
---|---|
TIL 2024-01-26 Logback (0) | 2024.01.26 |
TIL 2024-01-24 유저 테스트를 시작하면서 느끼는 점 (0) | 2024.01.24 |
TIL 2024-01-23 프로세스와 쓰레드 (0) | 2024.01.24 |
TIL 2024-01-22 타임리프 작성자가 아닐 시 버튼 안보이게 하기 (0) | 2024.01.22 |