Java&Web

[Logging] slf4j(Simple Logging Facade For Java)란

프로그래민 2020. 12. 30. 18:21
반응형

[Logging] slf4j, log4j, logback, log4j2

 

[Logging] slf4j, log4j, logback, log4j2

로그(log)는 소프트웨어의 이벤트를 기록하는 것으로써, 소프트웨어의 동작상태를 파악하고 문제가 발생했을 때 이 동작 파악을 통해서 소프트웨어의 문제를 찾아내고 해결하기 위해 디자인 되

minkwon4.tistory.com

 

지난번 글에서 Java의 로깅 프레임워크인 slf4j, log4j, logback, log4j2에 대해 알아보았다. 그 중 slf4j에 대해 깊게 조사해보았다.

 

slf4j란?

slf4j는 Simple Logging Facade For Java의 약자로써 slf4j의 공식 문서에 따르면 "slf4j는 다양한 로깅 프레임 워크(ex. java.util.logging, logback, log4j등)에 대해 간단한 Facade 또는 추상화 역할을 하여 사용자가 배포시 원하는 로깅 프레임워크를 연결할 수 있도록 도와준다"라고 적혀있다.

Facade Pattern(퍼사드 패턴)
소프트웨어 공학 디자인 패턴 중 하나로써 객체 지향 프로그래밍 분야에서 자주 쓰인다. Facade는 외관을 의미하는 뜻으로 소프트웨어적 관점에선 클래스 라이브러리 같은 어떤 소프트웨어의 다른 커다란 코드 부분에 대한 간략화된 인터페이스를 제공하는 객체이다. 즉, 어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공하는 패턴이다.

Facade Pattern

다시 돌아와 공식 문서에 의하면 sfl4는 다음과 같은 기능을 제공한다.

  • Java 로깅 프레임워크에 대한 추상화, 공통된 인터페이스 제공
  • 구현체의 종류에 상관없이 일관된 로깅 코드 제공
  • Java 로깅 프레임워크간의 쉬운 전환
  • 3가지 모듈(API, Binding, Bridging)을 제공

 

slf4j의 API

slf4j-api

위는 slf4j-api 1.7.30버전 라이브러리를 추가시켜놓은 상태이다. slf4j-api를 추가시킴으로써 Logger, LoggerFactory등의 classs 및 interface등을 사용하여 일관된 로깅 코드를 사용할 수 있는 환경을 구성할 수 있다. 다만, slf4j-api만을 이용해서는  로그 기능을 사용할 수 없고, slf4j의 다른 모듈인 Binding 기능을 이용하여 하나의 Java 로깅 프레임워크(ex. logback, log4j2등)를 구현체로써 사용해야 한다.

 

slf4j의 Binding

slf4j의 Binding 구조

Binding 이란 slf4j의 인터페이스의 로깅 구현체와 로깅 프레임워크사이의 연결역할을 하는 모듈로써 대표적으로 logback-classic(logback), slf4j-log4j12(log4j2) 등등을 slf4j와 Java 로깅 프레임워크 사이에서 사용할 수 있다. 이러한 Binding에 있어서 구현체로 선택되는 Java 로깅 프레임워크는 오직하나 존재해야한다.

logback과 log4j2의 Binding에 대해 실습을 해보았다.

logback-classic

위는 logback의 Binding에 사용되는 logback-classic 1.2.3버전 라이브러리를 추가시킨 상태이다. logback-classic은 크게 logback-core와 slf4j-api를 포함하고 있다. slf4-api는 앞서 이미 추가했기 때문에 개발환경인 인텔리제이에 의해 자동으로 omitted 되어 있는 상태이다. logback-classic을 사용한다면 slf4j의 구현체로써 logback이 Binding되는 것을 확인할 수 있다.

slf4j-log4j12

위는 log4j2의 Binding에 사용되는 slf4j-log4j12 1.7.30버전 라이브러리를 추가시킨 상태이다. slf4j-log4j12는 log4j와 slf4j-api를 포함하고 있다. 앞서 logback-classic 처럼 인텔리제이에 의해 slf4j-api는 omitted되어 있고, slf4j의 구현체로써 log4j2가 Binding을 되는 것을 확인할 수 있다.

 

slf4j의 Bridging

Briding 이란 다른 컴포넌트에서 사용되는 slf4j이외의 다른 Java 로깅 프레임워크에 대해 slf4j의 인터페이스로 연결하여 slf4j API가 대신 처리할 수 있도록 해주는 모듈이다. 즉, 다른컴포넌트의 Java 로깅 프레임워크 -> Bridge -> slf4j API와 같은 과정을 이루어지도록 해준다.

slf4의 Bridging

Jakarta Commons Logging과 log4j 그리고 java.util.logging의 Bridging를 도와주는 jcl-over-sfl4j 1.5.6라이브러리, log4j-over-slf4j 1.7.25라이브러리 그리고 jul-to-slf4j 1.7.30f라이브러리에 대해 실습해보았다.

slf4j로의 Bridging 라이브러리

이러한 Bridging 라이브러리를 적용할 때 주의해야할 점이 있다. 바로 Bridging 이후의 Binding이 이루어지면서 다시 Bridging이 일어나면서 무한루프를 도는 경우가 생길수도 있다. 따라서 이경우를 방지하기 위하여 다음과 같은 조합은 같이 사용할 수 없다.

  • jcl-over-slf4j + slf4j-jcl => 무한루프 발생
  • log4j-over-slf4j + slf4j-log4j12 => 무한루프 발생
  • jul-to-slf4j + slf4j-jdk14 => 무한루프 발생

 

출처
gmlwjd9405.github.io/2019/01/04/logging-with-slf4j.html
ko.wikipedia.org/wiki/%ED%8D%BC%EC%82%AC%EB%93%9C_%ED%8C%A8%ED%84%B4
www.slf4j.org/manual.html
www.slf4j.org/legacy.html
반응형