이번에 일하는 회사에서 신입분이 들어오셔서 디버깅과 로거의 개념을 알려드리기위해 나도 정리를 해보았다.
디버깅을 하는 이유
"디버그(debug)는컴퓨터 프로그램 상의 오류(버그)를 찾아내어 바로잡는 과정을 뜻한다.디버깅(debugging)이라고도 한다. "
디버깅 방법
디버깅 (개념 / 과정 / Intellij 디버깅 방법 / Eclipse 디버깅 방법)
sysout logger 차이
휘발된다
System.out.println() 은 로그가 표준 출력으로 출력된다. 즉, 파일로 저장되지 않고 휘발된다는 의미이다. 로그는 에러가 발생한 상황을 기록하고, 추후 확인하여 문제를 진단하고, 재현하고, 고치기 위해 사용된다. 하지만 표준 출력으로 한번 출력되고 어디에도 저장되지 않으면 로그의 제 역할을 할 수 없다.
로그된 데이터는 실제로 기록되어야 한다. 하지만 System.out.println() 만으로는 불가능하다.
에러 발생 시 추적할 수 있는 최소한의 정보가 남지 않는다
System.out.println() 은 인자로 전달한 문자열만을 출력한다. 문제가 발생한 날짜, 시각 그리고 문제의 수준, 로그가 발생한 위치 등 최소한의 정보가 기록되지 않는다는 것 이다. 이런 제한적인 정보만으로는 문제를 해결하기 어려울 것 이다. 물론 이런 정보도 함께 인자로 전달한다면 충분히 에러와 장애를 추적할 수 있는 정보를 남길수야 있지만… 매번 그런 정보를 일일히 남기기엔 번거로울 것 이다.
로그 출력 레벨을 사용할 수 없다
로컬에서 개발할 때에는 디버깅을 위한 아주 상세한 정보가 출력되어 확인할 수 있어야한다. 하지만, 프로덕션에서 동작하는 코드는 에러/장애가 발생할 때 문제를 진단할 수 있는 정보만을 남겨야한다. 개발시에만 사용되는 정보와 문제 상황에 대한 정보가 함께 로깅된다면 문제 해결을 위한 정작 중요한 정보를 얻기 힘들 뿐더러, 민감한 정보를 로그로 남길수도 있기 때문이다. 또한 의미없는 로그가 쌓여 서버 용량을 차지할 수도 있다.
따라서 로깅 라이브러리는 환경에 맞게(로컬 개발 환경, 개발 서버, 프로덕션 서버 등) 로그가 출력될 수 있도록 로그 출력 레벨이라는 기능을 제공한다. 많이 사용되는 Logback이라는 라이브러리에서는 TRACE, DEBUG, INFO, WARN, ERROR, FATAL 와 같은 레벨을 제공한다. 하지만 System.out.println() 은 이런 기능을 제공하지 않는다. 어떤 환경에서든 동일한 로그가 출력된다. 프로덕션에서 이런 로그를 제거하려면 코드를 일일히 제거하거나 주석처리하거나 별도의 조건문을 설정하는 등 번거로운 일들을 해야한다.
성능저하의 원인이 될 수 있다
로깅을 System.out.println() 로 하면 안되는 이유
Logger라이브러리 : slf4j, log4j2, logback 등
JAVA logging framework (기본) - slf4j, log4j와 logback
Logger레벨
log4j2 는 다음과 같은 로그 레벨을 가진다.
TRACE > DEBUG > INFO > WARN > ERROR > FATAL
INFO로 셋팅하면, INFO, WARN, ERROR, FATAL은 기록된다.
FATAL : 아주 심각한 에러가 발생한 상태를 나타낸다.
ERROR : 어떠한 요청을 처리하는 중 문제가 발생한 상태를 나타낸다. 프로그램 동작에 큰 문제가 발생했다는 것으로 즉시 문제를 조사해야 하는 것 (DB를 사용할 수 없는 상태, 중요 에러가 나오는 상황)
WARN : 프로그램의 실행에는 문제가 없지만, 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지를
나타낸다. WARN에서도 2가지의 부분에선 종료가 일어남
- 명확한 문제 : 현재 데이터를 사용 불가, 캐시값 사용 등
- 잠재적 문제 : 개발 모드로 프로그램 시작, 관리자 콘솔 비밀번호가 보호되지 않고 접속 등
INFO : 어떠한 상태 변경과 같은 정보성 메시지를 나타낸다.
DEBUG : 개발시 디버그 용도로 사용하는 메시지를 나타낸다.
TRACE : 디버그 레벨이 너무 광범위한 것을 해결하기 위해서 좀 더 상세한 이벤트를 나타낸다.
'개발 > 개발지식' 카테고리의 다른 글
도메인 네임(Domain Name) (0) | 2024.06.06 |
---|---|
트랜잭션 (0) | 2024.06.06 |
[네트워크] 로드 밸런싱(Load balancing) (0) | 2023.05.11 |
암호화 알고리즘 (0) | 2023.04.25 |
블록 다이어 그램 (0) | 2023.04.23 |