티스토리 뷰

Back-End/Spring

Spring boot 로깅

wan-blog 2020. 2. 2. 22:25
반응형

1. Spring boot 로깅

1.1. Log 란

“프로그램 개발 중 및 완료 후 발생할 수 있는 오류에 대해 디버깅하거나 운영 중인 프로그램 상태를 모니터링 하기위해 필요한 정보(로그)를 기록하는 것”을 의미합니스프링에서 모니터링을 하기위해 로그를 셋팅하다보면 많은용어들을 만나게됩니많이 보이는 용어를 정리해보면 아래와 같습니다.

  • native java.util.logging: 별로 사용하지 않는다.
  • Log4j: 몇 년 전까지 사실상 표준으로 사용했다.
  • Logback: Log4J 개발자가 만든 Log4j의 후속 버전, 현재 많은 프로젝트에서 사용되고 있다.
  • slf4(Simple Logging Facade for Java): jcl, Log4j 이후에 나온 로깅 프레임워크로 가장 많이 사용된다.

이러한 용어들이 있고 실제 그럼 Spring boot에서 어떤식으로 로깅이 이루어지는지 알아보겠습니다.

1.2. Spring boot 로깅

Spring boot 는 기본적으로 spring-jcl모듈을 이용하여 로깅을 한JCL모듈은 Spring boot starter web을 추가하면 자동으로 의존성이 추가된우리 스프링부트에서 기본적으로 JCL을 통해 로그를 기록하는데 기록은 아래와 같은 순서를 통해 로그를 기록한다.

  • Spring boot 는 기본적으로 Spring-jcl(자카르타 커먼 로깅) 모듈을 이용하여 로깅을한다.
    • Spring-JCL(jakarta common logging)은 구현체가아닌 추상화라이브러리이다.
  • Spring boot 애플리케이션에 JCL은 내부적으로 jcl-over-slf4j 브릿지(어댑터)를통해 slf4j API를 호출한다.
  • Spring boot 애플리케이션은 slf4j API구현체인 logback-classic 을 사용하여 logback-core를 호출하여 로그를 기록한다.
  • 로그는 기본적으로 콘솔과 파일로할 수 있는데 디폴트는 콘솔출력이다.
  • 기본적으로 10m로 롤링됨

다이어그램으로 표현하면 아래와같다.

https://i.imgur.com/98UTZ2i.png

요즘에는 jcl브릿지를 사용하기보다는 롬복을 이용해 slf4j API를 바로 호출하는 추세이그러한 이유는 다음과 같이 jcl로 로그시 아래와같은 문제를 가지게 된다.

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

...
private final Log log = LogFactory.getLog(getClass());
....
if(this.log.isDebugEnabled()){
    this.log.debug("This is " + 123);
}

위와같이 하지 않으면 string 연산을 해야하니까 부담이 있을 수 있위와 같이하는게 베스트프랙티스이위와같은 문제를 slf4j를 이용하면 아래와같이 해결할 수 있다.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
log.info(Loading source {}", 123}
...

1.2.1. JCL (Jakarta commons logging) 란

  • JCL은 로깅 라이브러리가 아니라 로깅 추상화 라이브러리다.
  • 로깅 라이브러리 선택권은 애플리케이션 개발자의 것이다.
  • 따라서 라이브러리나 프레임워크는 주로 로깅 추상화 라이브러리를 사용한다.

JCL이 로깅 구현체를 찾는방법

  • 설정파일에서 사용할 구현체를 찾기
  • 애플리케이션 클래스 패스에서 사용할 로그 라이브러리 구현체를 찾기
  • 아무것도 못찾으면 기본 구현체(JCL LogAdapter.class 사용)

JCL을 꺼리는 이유

  • JCL은 클래스로더에 의존적인 방법으로 구현체를 찾는다.

그래서 다이렉트로 slf4j를 사용하는것을 추천함.

slf4j(Simple Logging Facade for java)란

  • Simple Logging Facade For Java
  • slf4j api를 사용하면 구현체의 종류에 상관없이 일관된 로깅 코드를 작성할 수 있다.
  • 로깅 라이브러리를 런타임이 아닌 컴파일 타임에 정한다.
    • 개발할 때, slf4j API를 사용하여 로깅 코드를 작성한다.
    • 배포할 때, 바인딩된 Logging Framework가 실제 로깅 코드를 수행한다.
  • 세가지 모듈(Bridging, API, Binding)으로 구성되어있음
slf4j Bridge

(slf4j 이외의) 다른 로깅 API로의 Logger 호출을 slf4j 인터페이스로 연결(redirect)하여 slf4j API가 대신 처리할 수 있도록 하는 일종의 어댑터 역할을 하는 라이브러리

  • 다른 로깅 API -> Bridge -> slf4j API
  • 로거 호출을 slf4j 인터페이스로 연결

https://i.imgur.com/034ZLnA.png

Bridge 설명
jcl-over-slf4j.jar JCL API에 의존하는 클래스들을 손상시키지 않고 JCL로 들어오는 호출을 JCL-over-SLF4J를 이용해서 SLF4J API를 호출한다. 즉, 이 모듈을 사용하면 JCL을 사용하는 기존 소프트웨어와의 호환성을 손상시키지 않으면서 프로젝트를 SLF4J로 단편적으로 마이그레이션할 수 있다.
log4j-over-slf4j.jar 이 모듈을 사용하면 log4j 호출을 SLF4J API로 리디렉션할 수 있다.
jul-to-slf4j.jar 이 모듈을 사용하면 java.util.logging 호출을 SLF4J API로 리디렉션할 수 있다.

 브릿지 사용시 주의 사항

동종 브릿지를 사용한다면 아래와같은 문제를 가짐, 그래서 브릿지랑 바인딩이 동종브릿지를 사용하지 않도록 주의해야함

https://i.imgur.com/vFO9e8X.png

slf4j API

slf4j 인터페이스이다.

  • slf4j-api-{version}.jar
  • 실제 API를 호출하여 로그를 출력

slf4j(API) → logback-classic(Binding)

slf4j Binding (slf4j API 구현체들)

slf4j API를 로깅 구현체(Logging Framework)와 연결하는 어댑터 역할을 하는 라이브러리

  • slf4j 인터페이스를 로깅 구현체로 연결
  • 어댑터 역할
  • 여러 바인딩 중 반드시 한개만 사용할것
    • slf4j-log4j12-{version}.jar
    • slf4j-jdk14-{version}.jar
    • slf4j-nop-{version}.jar
    • slf4j-jcl-{version}.jar
    • logback-classic-{logback-version}.jar - Spring boot default

SLFJ Binding

Binding 설명
slf4j-log4j12-{version}.jar 널리 사용되는 로깅 프레임워크인 log4j 버전 1.2에 대한 바인딩. 또한 log4j.jar을 클래스 경로에 배치해야 한다.
slf4j-jdk14-{version}.jar java.util.logging(JDK1.4 로깅)에 대한 바인딩.
slf4j-nop-{version}.jar NOP에 대한 바인딩. 모든 로깅을 자동으로 삭제합니다.
slf4j-nop-{version}.jar 모든 이벤트를 System.err에 출력하는 단순 구현 바인딩. INFO 이상의 메시지만 출력되므로 작은 응용 프로그램에서 유용하다.
slf4j-jcl-{version}.jar JCL(Jakarta Commons Logging)에 대한 바인딩.모든 slf4j 로깅을 JCL에 위임한다.
logback-classic-{logback-version}.jar (logback-core-{version}.jar 필요) native implement Logback의 클래스는 slf4j의 인터페이스를 직접 구현한 것으로, slf4j 프로젝트 외부에 slf4j 바인딩이 있다. 따라서 Logback과 함께 slf4j를 사용하면 메모리 및 오버헤드가 발생하지 않는다.Logback의 ch.qos.logback.classic.Logger 클래스는 slf4j의 org.slf4j.Logger 인터페이스를 직접 구현한 것이다.

1.3. 기타

  • 아파치를 예전에 자카르타라고 불렀음
  • spring boot logback 기본설정을 변경하고싶다면 logback.xml을 reosurce 폴더에 생성
  • spring boot 패키지에 logging 폴더에 default log 설정이 있음.
  • spring boot 기본로깅 설정

1.4. 참고


반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함