카테고리 없음

log4j, log4j2, logback, slf4j, Apache Commons Logging(JCL) 비교

아디봉 2022. 11. 8. 14:38

Logging이란?

시스템 동작 시, 시스템 상태/작동 정보를 시간의 경과에 따라 기록하는 것을 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 기록 가능
  • log4j보다 약 10배 빠르고 메모리 점유율이 낮음
  • 수년간의 엄격한 테스팅을 거쳐 안정성 보증
  • 에러나 IO failure로 인항 재설정이 자동으로 실행되면서 빠르게 복구 가능
  • 서버 restart 없이 설정 변경 가능

4. log4j2

  • Apache 재단에서는 Log4j와 Logback의 설계적 결함을 개선한 로깅 API로 소개
  • java 8부터 지원되는 람다 표현식 지원
  • 비동기적 로거 지원
  • 서버 restart 없이 설정 변경 가능
  • log4j, logback에 비해 압도적 성능
    • garbage 생성이 낮아 gc 발생 확률을 줄이기 때문에 성능 향상 기대
    • logback, log4j는 ArrayBlockingQueue를 사용하는데, 이 Queue를 사용하면 multi thread 응용 프로그램에서 log event를 queue에 넣으려고 할 때 종종 잠금 경합이 발생. 반면, log4j2의 비동기 logger는 잠금이 없는 데이터 구조(LMAXDisruptor)를 사용.
    • 상대적으로 더 짧은 대기시간
      https://logging.apache.org/log4j/2.x/performance.html

5. Apache Commons Logging(JCL)

6. SLF4J

  • JCL과 마찬가지로 Facade 라이브러리
  • JCL이 가지고 있었던 치명적인 문제들 해결
  • SLF4J의 인기가 높아짐에 따라 SLF4J 자체에도 logging implementation을 포함

 

참고

https://yjh5369.tistory.com/entry/java-logging-frameworklog4j-log4j2-slf4j