본문 바로가기

CS/Java

로깅 시 System.out.println()을 사용하지 않는 이유

System.out.println() 메서드는 자바 표준 출력이다.

하지만, 현업에서는 단순 디버깅 용도로도 System.out.println()을 사용하지 않는다고 한다.

휘발된다

System.out.println()은 표준 출력으로 사용한다. 즉, 파일로 저장되지 않고 휘발된다.

로그 파일로서 관리가 불가하여 문제를 기록하고 처리할 때, 로그를 확인할 수 없다.

에러 발생 시 추적할 수 있는 최소한의 정보가 남지 않는다

System.out.println()은 단순히 문자열을 출력하는 메서드이다.

따라서, 로깅 시 필요한 문제가 발생한 날짜, 시각, 문제의 수준, 위치 등 최소한의 정보가 기록되지 않는다.

이런 정보도 함께 인자로 전달하여 추적할 순 있지만, 매번 그런 정보를 일일이 남기는 작업은 번거롭다.

로그 출력 레벨을 사용할 수 없다

프로젝트 개발 단계에서는 디버깅을 위한 상세한 로그들을 출력하고 활용하는 경우가 많지만, 실제 프로덕션 환경에서 동작하는 코드의 경우에는 리소스의 낭비를 줄이기 위해 에러 및 장애가 발생할 때의 문제를 진단할 수 있는 로그만 남겨야 한다. 

System.out.println()은 어떤 환경이든 동일한 로그가 출력되며, 프로덕션에서 이런 로그를 제거하려면 코드를 일일이 제거해야 한다.

로깅 라이브러리는 환경에 맞게(로컬, 개발, 프로덕션 등) 로그가 출력될 수 있도록 로그 출력 레벨(TRACE, DEBUG, INFO, WARN, ERROR, FATAL)이라는 기능을 제공한다.

성능저하의 원인이 된다

System.out.println()synchronized로 동기화 처리가 되어있어, 오버헤드가 발생한다.

synchronized는 메서드나 블록 코드에 1개의 스레드만 접근할 수 있도록 하여 여러 스레드가 사용하게 되면 오버헤드가 발생하여 프로세스 처리가 늦어지게 된다.

스프링을 실행하는 톰캣은 멀티 스레드로 동작한다. 요청이 오면 스레드 풀에서 스레드를 하나 가져와 요청을 처리한다. 만약 System.out.println()을 여러 스레드가 사용하면 오버헤드가 발생하고 처리가 늦어진다.

 

 

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

가비지 컬렉션  (0) 2023.09.02
new String()과 리터럴("")  (1) 2023.08.12
String, StringBuffer, StringBuilder  (0) 2023.08.12
equals()와 hashCode()  (0) 2023.08.11
Java 컴파일 과정  (0) 2023.05.18