Domain/Spring

[Spring] Logging과 LoggingFramework

by Donghwan 2022. 9. 2.

Logging이란 시스템이 동작할 때, 시스템의 상태 및 동작 정보를 시간 경과에 따라 기록하는 것을 의미합니다.

개발 과정 혹은 개발 후에 발생하는 동작에 대해 트래킹을 하여 예기치 못한 이슈를 진단 및 해결하는데 도움이 됩니다. 하지만 무분별한 로깅은 성능상 이슈를 발생할 수 있기 때문에 의미있는 정보를 적절한 수준으로 수집하는 것이 중요합니다.

Java는 System.out.println()을 이용하거나 Logging Framework를 사용하여 로그를 남길 수 있습니다.

# System.out.println() #
일명 sout, System.out.println()은 Java를 처음 접할 때부터 사용할 수 있는 간단한 로깅 방법입니다.
가장 편하고 확인하기 좋은 방법이지만 성능에 영향을 많이 주는 경우가 빈번히 발생합니다.
파일이나 콘솔에 로그를 남길 경우 내용이 완전히 프린트되거나 저장 될 때까지 다른 작업들이 대기할 수 밖에 없습니다.
그렇게 되면 애플리케이션에서는 대기시간이 발생하게 됩니다. 또 이 대기시간은 시스템의 속도에 의존적입니다.
또 Locale의 영향으로 실제 결과와 콘솔에 출력되는 결과가 다를 수 있습니다.
가장 큰 문제는 sout은 개발할 때만 사용된다는 부분입니다. 단순한 디버그용 로그를 운영서버에서 고스란히 처리할 수 없기 때문입니다.
# Logging Framework #
Java에는 성능과 편리함을 잡은 다양한 Logging Framework가 있고, 이를 통해 쉽게 로깅을 처리할 수 있습니다.
Logging Framework에는 java.util.logging, Log4j, Log4j2, LogBack, Slfj4가 있습니다.

 

Logging Framework

java.util.logging

  • Java에서 기본적으로 제공되는 Log package
  • 파일이나 콘솔에 로그 내용을 출력할 수 있음
  • jre/lib/logging.properties 파일을 편집해 로그의 출력 방식 로그 레벨을 변경할 수 있음(IDE console)
  • OFF, SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST, ALL의 로그 레벨 제공합니다.
  • OFF는 로깅을 끄는 데 사용할 수 있는 특수 수준을 의미합니다.
  • SEVERE는 심각한 이슈이고 ALL로 갈 수록 이슈의 중요도가 낮아집니다.
  • 문제는 이 유틸리티가 1.4부터 공개되었고 이때는 이미 log4j라는 라이브러리가 널리 사용하고 있어 굳이 사용할 필요가 없었습니다.
  • 다른 라이브러리와 비교를 했을 때 속도도 느리며 미리 정의된 레벨의 개념이 명확하지 않다는 단점이 있습니다.

 

Log4j

  • Apache의 Java 기반의 Logging Framework입니다.
  • 가장 오래된 Logging Framework이며, Log4j2가 등장하였고 현재는 개발이 중단되었습니다.
  • 최신 로깅 프레임워크에서 여전히 사용하는 계층적 로그 레벨과 로거와 같은 기본 개념을 도입 했습니다.
  • Log4j는 logger, appender, layout 3개의 컴포넌트로 이루어져 있습니다.
  • logger는 데이터를 기록하는 역할을 하며, appender는 데이터를 어디에 기록할지, layou은 어떤 스타일로 데이터를 기록할지 정하는 역할을 합니다.
  • Log4j는 기본적으로 SLF4J 를 지원하지 않고 추가적인 종속성을 추가해줘야 합니다.

 

Logback

  • log4j와 동일한 개념을 따르지만 향상된 성능과 필터링 옵션을 제공합니다.
  • SLF4J를 기본으로 지원합니다.
  • SpringBoot의 기본으로 설정되어 있어서 사용시 별도로 라이브러리를 추가하지 않아도 사용이 가능합니다.
  • Automatic Reloading 기능을 제공하여 별도에 재시작없이 설정을 변경할 수 있습니다.

 

Log4j2

  • 파일뿐만 아니라 HTTP, DB, Kafka에 로그를 남길 수 있으며 비동기적인 로거를 지원합니다.
  • 로깅 성능이 중요시될 때 Log4j2 사용을 고려합니다.
  • spring-boot-starter-web 모듈에 Logback을 사용하는 spring-boot-starter-logging 모듈이 포함되어있습니다.
  • Log4j2 사용을 위해서는 spring-boot-starter-logging 모듈을 exclude하고 spring-boot-starter-logging-log4j2 의존성을 주입해야 합니다.
  • Logback과 달리 멀티 쓰레드 환경에서 비동기 로거(Async Logger)의 경우 Log4j 1.x 및 Logback보다 성능이 우수합니다.

 

SLF4J

  • SLF4J(Simple Logging Facade For Java)란 Logging Framework들을 추상화해 놓은 것입니다. Facade Pattern을 이용한 Logging Framework입니다.
  • SLF4J를 이용해서 로깅이 되는것처럼 보인다. 하지만, 설정에 따라 배포 시 SLF4J는 (Logback, Log4J, jul)중 바인딩된 Logging Framewkork가 실제 Logging을 수행합니다.
  • Logging 관련 다양한 라이브러리들을 하나의 통일된 방식으로 사용할 수 있는 방법을 제공합니다.
  • 초기의 Spring은 JCL(Jakarta Commons Logging)을 사용하여 로깅을 구현했습니다. JCL을 사용하면 기본적인 인터페이스인 Log와 Log 객체 생성을 담당하는 LogFactory만 구현하면 로깅 구현체 교체가 자유로운 구조를 가지고 있습니다. 하지만 JCL은 GC가 제대로 작동하지 않는 등의 단점이 존재했고, 이 때 도입된 것이 SLF4J입니다.
  • SLF4J는 Java 진영의 다양한 로깅 프레임워크들에 대한 공용 인터페이스(Facade)입니다. 공용 인터페이스를 통해 특정 로깅 프레임워크에서 다른 로깅 프레임워크로 쉽게 전환할 수 있습니다. JCL이 지닌 문제 해결을 위해, 클래스로더 대신에 컴파일 시점에 구현체를 선택하도록 변경되었습니다.

 


참고자료

728x90
반응형

'Domain > Spring' 카테고리의 다른 글

Spring Security  (0) 2023.05.31
Filter  (0) 2023.01.28
[Spring] Web.xml  (0) 2021.11.30
[Spring] JPA 영속성 컨텍스트  (0) 2021.11.18
[Spring] Context ( RootContext, ServletContext )  (0) 2021.11.18

댓글