본문 바로가기
Java

[Java] logger(slf4j, log4j), system.out.println()

by 왕타오 2023. 11. 27.

지난 게시글에서 콘솔에 로깅을 할때 사용하는 system.out.println() 메소드를 직접 확인해보며 

실제 운영 중인 서버에서는 사용하지 않아야 한다고 정리했다.

그리고 일반적으로 개발자들이 로깅을 할때 logger를 사용하는 것을 추천한다고 했다. 

 

그런데 logger 또한 서버의 성능에 영향을 미치지는 않을까? 왜 logger를 사용해야하지? 에 대해 추가적으로 고민해보지 못했다. 

 

어떤 시스템을 개발하던 반드시 로그를 남겨야 한다. 소프트웨어 개발 과정 혹은 개발 후에 동작 상태를 파악하고,

문제가 발생했을 때 진단하고 해결하는데 도움이 되기 때문이다. 

 

로그를 남기는 방법에는 시스템 로그(system.out.println), logger(slf4j, log4j) 등 여러가지가 있겠지만,

어떤 logger를 사용하던 모두 성능상 이슈가 발생할 수 있다고 한다. 따라서 각각의 로깅 라이브러리가 내부적으로 어떻게 동작하는지 잘 이해하고 있을 필요가 있다.

 

간단하게 시스템 로그(system.out.println)를 짚고 넘어가보자.

 

system.out.println()을 로깅에 사용하면 안좋은 이유

 

시스템 로그를 로깅에 사용하면 성능상 좋지 않다. 내부적으로 print(), newLine(), write()를 호출하는데, 해당 함수들이 내부적으로 

synchronized 키워드를 이용하여 구현 되어있기 때문이다. 이 때문에 하나의 스레드가 println()를 호출하면 다른 스레드는 접근하지 못해 응답 속도가 느려지는 원인이 된다. 또한 콘솔 출력은 개발 과정에서만 도움이 되므로 운영환경에서는 모두 지워줘야하는 번거로움도 있다.

 

시스템 로그 vs. logger 

 

logger도 무분별하게 사용하면, 시스템 로그와 마찬가지로 프로그램이 실행되는 동안 모든 로그를 처리하므로 성능에 좋지 않다.

그럼에도 logger를 사용하는 이유는 뭘까? 

 

시스템 로그는 콘솔에 출력만 할 수 있는 반면, logger는 별도의 파일에 저장될 수 있는 기능을 제공한다. 

로그가 별도의 파일에 저장되면, 애플리케이션을 디버그하고 모니터링하는데 훨씬 용이하다. 

 

시스템 로그는 남긴 로그를 모두 콘솔에 출력하지만, logger는 남긴 모든 로그를 필요에 따라 구분하여 출력 혹은 파일에 저장할 수 있다.

이때 구분하는 기준을 로그 레벨(Logging Level)이라고 한다. 로그를 레벨에 따라 처리하면 모든 로그를 처리하는 것에 비해 성능이 좋고, 해당 로그가 어떤 문제인지, 심각성은 어떤지 빠르게 파악할 수 있다. 

logging 프레임워크를 사용하여 쉬운 사용환경 조성이 가능하다.

 

음... 이제 시스템 로그 보다는 logger를 사용해야하는것에 대해 어느 정도 이해가 되었다. 

그러면 logger의 종류에는 어떤 것이 있고, 무엇을 사용하는게 좋을지에 대해서도 알아보자.

 

대표적으로 널리 사용되는 logging 프레임워크로는 log4j(log4j2), slf4j, logback 등이 있다. 

 

log4j ?

log4j는 Apache의 Java기반 로깅 프레임워크이다. 가장 오래된 프레임워크이며, 2015년 기준으로 개발이 중단되었다. log4j는 다음과 같은 구성을 가지고 있다.

 

log4j의 구성

요소 설명
Logger 출력할 메시지를 Appender에게 전달
Appender 전달된 로그를 어디에 출력할 것인지 결정(Console, File, JDBC 등)
Layout 로그를 어떤 형식으로 출력할 것인지 결정

 

logback ?

log4j 이후에 출시되었으며 log4j의 여러 문제점을 개선한 로깅 프레임워크. log4j를 개발한 개발자가 프로젝트를 이끌어 log4j와 개념적으로 유사하다고 한다.

logback은 log4j에 비해 logging이 빠르게 수행되며, 메모리 공간을 상대적으로 적게 사용한다. 장애 발생시 원활한 복구가 가능(서버 재시작 없는 자동 리로딩 지원 등) 하다. 

 

 

log4j2 ?

가장 최신에 나온 Apache의 log4j의 다음 버전이다. logback처럼 필터링 기능과 자동 리로딩을 지원한다. logback과의 가장 큰 차이는 Multi Thread 환경에서 다른 로깅 프레임워크보다 처리량이 훨씬 많고, 대기 시간이 훨씬 짧다는 점이다. 

참고 : log4j vs. log4j2

Multi Thread 환경에서 로깅 프레임워크 성능비교

 

 

 

 

slf4j ?

slf4j는 Simple Logging Facade For Java의 약자로써 자체적인 로킹 프레임워크가 아니고 logger 추상체로써 다른 로깅 프레임워크가 접근할 수 있도록 도와주는 추상화 계층이다. 즉, logback이나 log4j2와 같은 로킹 프레임워크의 인터페이스의 역할을 해준다. 따라서 slf4j2를 이용하면 코드를 일정하게 유지하면서 구현체의 전환을 통해 다른 로깅 프레임워크로의 전환을 쉽고 간단하게 할 수 있다. 

로깅 프레임워크의 인터페이스의 역할을 하는 slf4j

 

 

참고 : logging, slf4j, logback