System.out.println() 대신 log를 사용해야 하는 이유
스프링을 배우고 나서부터, System.out.println() 을 잘 쓰지 않는 듯 하다. 어짜피 콘솔에 기록을 남기는 건 똑같은데 왜 자바에서 기본적으로 제공해주는 sout을 쓰지 않고 slf4j를 사용하는 걸까?
1. Log 레벨
sout은 단순히 출력 그 이상도 이하도 아니기 때문에, 메세지를 구분하거나 중요한 정보라고 따로 분류를 하기 어렵다. 반면, 로그는 레벨을 사용해 메세지의 중요도와 성격을 명확히 구분할 수 있다.
1) TRACE : 가장 상세한 로그 레벨로, 매우 세부적인 정보나 애플리케이션의 흐름을 추적할 때 사용한다.
2) DEBUG : 디버깅 목적으로 사용되는 레벨로, 애플리케이션의 상태를 이해하기 위해 유용한 정보를 제공한다. 보통 개발 환경에서 주로 사용되며, 운영 환경에서는 필요에 따라 사용된다.
3) INFO : 일반적인 정보 로그로, 애플리케이션의 정상적인 동작을 설명하거나, 중요한 이벤트를 기록할 때 사용한다.
4) WARN : 경고레벨로, 잠재적인 문제를 나타내지만, 즉각적인 오류는 아닌 경우 사용한다. 예상치 않은 상황이 발생했지만 시스템이 계속 동작할 수 있는 경우를 기록.
5) ERROR : 심각한 오류가 발생했을 때 사용하는 로그레벨로, 예외 처리나 비정상 종료를 기록한다.
확실히 그 동안 스프링은 열심히 문제를 알려주려고 노력했지만 내가 이게 뭔지 잘 몰라서 생각없이 지나갔던 부분이 느껴진다. 그리고 이렇게 보면 TRACE가 정보를 상세하게 알려주기 때문에 제일 좋고 이것만 쓰면 될 것 같은데, 또 정보가 너무 많은 만큼, 필요한 정보를 바로 찾기 힘들고, 많은 데이터를 출력해야 하기 때문에 성능에도 영향이 간다고 한다. 그렇기 때문에 어지간해서는 INFO 이상의 로그만 기록하는 게 좋다고 한다.
2. 퍼포먼스 :
sout은 콘솔에 직접 출력을 하기 때문에 성능에 영향을 줄 수 있다고 한다. 대용량 데이터를 출력할 때 애플리케이션의 실행 속도가 느려진다고 한다. 하지만 로그 라이브러리는 내부적으로 효율적인 처리를 도와줘서 성능 최적화를 해준다고 한다.
3. 로그 파일 관리 :
로그 라이브러리는 로그를 파일로 저장하거나, 필요에 따라 네트워크를 전송하는 등 다양한 출력을 관리할 수 있다. 프로덕션 환경에서는 콘솔 출력을 확인할 수 없는 경우가 많다고 한다. 그렇기 때문에 로그 파일이나 원격 로깅 시스템을 통해 상태를 모니터링하는 것이 중요하다.
4.포맷팅 및 구조화 부족
log를 사용하면 시간, 스레드 이름, 로그 레벨 등등 표준화된 방식으로 포맷팅해서 출력해주기 때문에 일관성을 유지할 수 있고, 분석에도 용이한데, sout으로 이런 걸 일일히 다 하려면 실수하기 쉽고 손도 많이 가기 때문에 로그 라이브러리를 사용하는 것이 좋다.