티스토리 뷰

CS/Java

System.out vs 로깅 라이브러리

bool-flower 2022. 7. 15. 21:40

로그를 남길 때는 System.out.prinln() 같은 메서드 대신에 로깅 라이브러리를 통해 로그를 출력한다. 이 글에서는 System.out를 쓰면 안 되는 이유로깅 라이브러리에 대해서 간략하게 정리했다. 혹시 잘못된 내용을 발견했다면 관련한 지적은 환영한당.

System.out을 쓰면 안 되는 이유

성능 저하

PrintStream 클래스의 println 메소드는 synchronized 키워드를 사용한다. print 등 출력 기능을 하는 다른 메서드들도 내부를 살펴보면 synchronized 키워드를 사용하는 것을 확인할 수 있다.

synchronized 키워드는 특정 객체에 lock을 걸어 해당 작업을 진행 중인 쓰레드 외에 다른 쓰레드는 해당 작업을 간섭하지 못하도록 막는다. 이를 동기화(synchronization)이라 한다. 

위 코드에서는 동기화를 통해 this 객체에 다른 쓰레드가 접근하지 못하게 막는다. this 객체를 사용하는 다른 쓰레드들은 lock을 얻을 때까지 기다려야 하고, 이는 성능 저하로 이어진다.

최소한의 정보가 없음

System.out을 사용하면 로그가 찍힌 날짜나 시간 등 로그를 기록함으로써 얻고자 하는 정보들이 없다.

로그 사용 시 장점

  • 쓰레드 정보, 클래스 이름 같은 부가 정보를 함께 볼 수 있고, 출력 모양을 조정할 수 있다.
  • 스프링에서는 패키지 별로 로그 출력하고자 하는 로그 레벨을 설정할 수 있다. 이를 이용해서 상황에 맞게 로그의 출력을 조절할 수 있다.
  • 콘솔뿐 아니라 파일이나 네트워크 등, 로그를 별도의 위치에 남길 수 있다.
  • 앞서 말한 것처럼 성능이 일반 System.out보다 좋다. (내부 버퍼링, 멀티 쓰레드 등) 

정리 및 느낀 점 

처음에는 단순히 로그의 장점 정도만 알면 된다고 생각하고 자료를 찾아봤는데, 표준 출력이나 쓰레드, 동기화 등등 생각보다 깊은 내용이 나와 당황했다. 하지만 덕분에, JDK 내부 코드도 직접 확인하고 breakpoint 찍어가면서 디버깅해보니까 나름대로 재미도 있고 더 깊이 있게 알게 된 것 같아 뿌듯하다.

참조

https://blog.silentsoft.org/archives/13

https://prde.tistory.com/161

https://junghyungil.tistory.com/160

https://blog.lulab.net/programmer/what-should-i-log-with-an-intention-method-and-level/

https://donggov.tistory.com/53

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1

'CS > Java' 카테고리의 다른 글

ArrayList에 요소가 추가되는 과정 파헤쳐보기  (0) 2023.02.03
Java Collection Framework  (0) 2022.11.16
equals  (0) 2022.10.05
Comparator와 Comparable  (0) 2022.05.29
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday