시스템 동작 시, 시스템 상태/작동 정보를 시간의 경과에 따라 기록하는 것을 logging이라고 하고 그 기록을 log라고 합니다.
이 log를 통해 사용자의 패턴이나 시스템 동작 자체의 분석에 사용될 수 있으며, 해킹 등의 사고가 발생한 경우 비정상 동작의 log를 통해 추적을 할 수 있습니다.
System.out.println을 사용하면 안 되는 이유
개발을 할 때 아무생각 없이 System.out.println을 사용하는 경우가 많습니다. 라이브러리도 추가할 필요 없고 sout이나 sysout 등의 단축 명령어로 자동 완성도 할 수 있어 사용하기 좋기 때문입니다.
System.out.println을 사용하면 logging framework를 사용할 때처럼 log를 출력한 곳이 어딘지 알 수가 없는 문제가 있는데, 더 큰 이유는 바로 성능 저하 때문입니다.
성능 저하의 이유는 크게 두가지로,블로킹 IO와 멀티 쓰레드락인(lock-in)이 발생하기 때문입니다.
System.out.println를 실행할 때 현재 thread는 System.out.println가 끝나기 전까지 아무 일을 실행할 수 없고 대기해야 하기 때문에 성능을 저하시킵니다. 문제는 현재 thread도 멈추지만 멀티 thread환경에서는 다른 thread까지 대기 상태로 만듭니다.
따라서 System.out.println은 사용하지 않는 것이 좋습니다.
java logging framework 종류
Java Logging API
Log4J
Log4J2
Apache Commons Logging(JCL)
SLF4J
1. Java Logging API
java 1.4부터 기본 제공되는 Logging API
Predefine 된 level의 개념이 명확하지 않음
나만의 custom level을 만들면 메모리 누수 발생
다른 framework에 비해 기능 부족
다른 framework와 비교했을 때 낮은 속도
유연하지 않음
2. log4j
옛날 옛적부터 쓰이던 가장 유명한 logging framework
2015년에 단종되어 log4j2로 대체
3. logback
log4j의 대체품으로 개발
2021-12-14일 기준 Spring Boot의 default logging framework. 따라서 logging framework를 따로 설정하지 않으면 logback이 기본으로 적용
Spring Boot에서 다른 logging framework를 사용하려면 의존성 제거를 해야 함
의존성 제거를 하지 않고 다른 logging framework의 의존성을 가져오고 설정한 뒤 application을 실행하면 오류 발생
Tomcat, Jetty와 같은 서블릿 컨테이너와 통합이 가능해 HTTP access log 기록 가능
logback, log4j는 ArrayBlockingQueue를 사용하는데, 이 Queue를 사용하면 multi thread 응용 프로그램에서 log event를 queue에 넣으려고 할 때 종종 잠금 경합이 발생. 반면, log4j2의 비동기 logger는 잠금이 없는 데이터 구조(LMAXDisruptor)를 사용.