본문 바로가기
카테고리 없음

로깅과 System.out.println()의 차이점

by cook_code 2023. 6. 20.
반응형

프로젝트를 하면 수많은 문제에 직면하게 되는데요.
그럴 때 로그를 찍어보거나 디버깅을 하는 경우가 많습니다. 
로그를 찍을 때 logger.xx 또는 System.out.println()을 사용해 콘솔에 정보를 띄우기도 하는데,
오늘은 이 둘의 차이점과 로깅 시 후자를 사용하면 안되는 이유에 대해 정리해보도록 하겠습니다. 

로그란? LOG

 
먼저 로그란 무엇일까요?

더보기

 

- 로그의 기원

로그의 1659년 존 콜라인이 쓴 항해법에 따르면 2시간마다

바다에 통나무를 띄워 선박의 속도를 측정했다고 합니다. 

과거 항해일지를 통나무에 기록했다하여 기록(지)을 영어로 log(book)이라고 하고, 

주로 관리와 관련된 곳에서 많이 사용된다고 합니다.  

아주 오래전 컴퓨터를 사용한 시간과 끝낸 시간을 제어해서

사용자를 통제했던 점과 그것을 기록한다는 점이 비슷하네요. 

 
보통 네트워크 접속 시 ip 주소나 접속한 운영체제 등이 서버 컴퓨터에 남습니다. 
로그는 컴퓨터나 서버 등에서 유저의 플레이 정보를 시간에 따라 남기는 기록을 뜻합니다.
개발자는 사고나 장애 발생시, 원인을 파악하고 대처할 수 있는 근거를 찾을 수 있습니다.
부팅/종료에 관련된 사항, 서비스 및 시작 프로그램의 정상실행 여부라든지, 드라이버 로딩의 오류,
예상치 못한 커널 패닉, 심지어 로그를 생성했다는 로그까지도...모두 기록할 수 있습니다. 
 

로그 대신 System.out.println()을 사용하면 안되는 이유

 
1. System.out.println()을 사용해 찍은 로그는 휘발됩니다. 
로그는 에러가 발생한 상황을 기록하고, 그 기록을 바탕으로 문제를 진단, 재현, 수정하기 위해 사용됩니다. 
System.out.println()은 표준 출력으로 한 번만 출력되고 어디에도 저장되지 않습니다. 
2. 에러 발생 시 추적할 수 있는 최소한의 정보가 남지 않습니다. 
로그는 문제가 발생한 날짜, 시각, 문제수준, 로그발생위치 등 최소한의 정보가 기록됩니다. 
하지만 System.out.println()은 단지 문자열만 출력합니다. 
3. 로그 출력 레벨을 사용할 수 없습니다.
로깅 라이브러리는 환경에 맞게 로그가 출력될 수 있도록 출력 레벨을 지정할 수 있습니다. 
로컬 개발 환경, 개발 서버, 프로덕션 서버 등
(TRACE, DEBUG, INFO, WARN, ERROR, FATAL)
System.out.println()을 로그 대신 사용한 경우 일일히 제거하거나 주석처리를 해야하는 번거로움이 있습니다. 
4. 성능저하의 원인이 될 수 있습니다. 
println()은 newLine()메소드를 호출합니다. 
newLine()은 쓰레드가 한 번에 하나씩만 동작할 수 있으므로 오버헤드가 발생할 수 있습니다. 
tomcat은 멀티 쓰레드로 동작하기 때문에 여러 요청이 들어와도 처리가 가능합니다. 
 

참고 사이트 

https://hudi.blog/do-not-use-system-out-println-for-logging/

로깅을 System.out.println() 로 하면 안되는 이유

학습 배경 우테코 레벨3 팀프로젝트 3차 데모데이 요구사항 중 하나는 ‘디버깅할 수 있는 로그 파일 출력’ 이다. 이전까지는 로깅에 대해 전혀 신경쓰지 않고 있었는데, 슬슬 로깅에도 신경써

hudi.blog

https://namu.wiki/w/%EB%A1%9C%EA%B7%B8

로그 - 나무위키

  은(는) 여기로 연결됩니다. 4호 라이더에 대한 내용은 가면라이더 로그 문서 를 , 에 대한 내용은 문서 를 , 에 대한 내용은 문서 를 , 에 대한 내용은 문서 를 , 에 대한 내용은 문서 를 , 에 대한

namu.wiki

 

반응형