웹 개발

java logging framework(log4j, log4j2, slf4j)

노루아부지 2021. 12. 14. 23:42

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 종류

그렇다면 어떤 logging framework를 사용하는 것이 좋을까요?

현재 유명한 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는 잠금이 없는 데이터 구조(LMAX Disruptor)를 사용.
    • 상대적으로 더 짧은 대기시간
      https://logging.apache.org/log4j/2.x/performance.html

 

 

5. Apache Commons Logging(JCL)

 

6. SLF4J

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

 

 

 

 

 

 

 

 

[참고 사이트]

https://daakludens.github.io/spring/logging/

 

개발자라면 로그는 알아야지

log

daakludens.github.io

https://en.wikipedia.org/wiki/Java_logging_framework

 

Java logging framework - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search A Java logging framework is a computer data logging package for the Java platform. This article covers general purpose logging frameworks. Logging refers to the recording of activity b

en.wikipedia.org

https://www.fwantastic.com/2019/12/javautillogging-vs-log4j-vs-slf4j.html

 

자바 java.util.logging vs log4j vs slf4j? 어떤 것을 사용해야 할까?

 

www.fwantastic.com

https://wildeveloperetrain.tistory.com/36

 

Spring Boot Logging 이란? (log4j, logback, log4j2)

Log, Logging이란? 로깅(logging)이란 시스템 동작시 시스템의 상태와 작동 정보를 시간의 경과에 따라 기록하는 것을 말합니다. 그리고 그 기록을 로그라고 합니다. 로깅을 하는 이유는 소프트웨어의

wildeveloperetrain.tistory.com

 

728x90
loading