본문 바로가기
Java & 스프링/스프링부트 톺아보기

[스프링 부트] 로깅

by hjhello423 2019. 10. 7.

지금부터 작성하는 로깅은 reference 문서를 꼭 참조해 보도록 하자. Logging reference

 

 


우선 로깅 퍼사드와 로거의 차이점을 알아보자.

 

Logging Facade(로깅 퍼사드) : 

- 로거 API를 추상화해둔 interface이다.

- 로거 선택을 자유롭게 하기 위해 사용한다.

- 보통 로깅 퍼사드를 통해 로그를 기록한다.

ex) Commons Logging, SLF4j

 

로거 : 

- 실제 로그를 기록하는 구현체이다.

ex) JUL, Log4J2, Logback

 

보통 어플리케이션을 개발하면 로깅 퍼사드를 통해 로거를 사용하게 된다.

스프링 부트에서는 기본 적으로 Commons Logging를 사용하게 되는데 내부 적으로 Spring-JCL의 개입을 통해 Commons Logging이 SLF4j를 SLF4j가 Logback를 호출하게 된다.

결과적으로 스프링의 로그는 Logback이 기록하게 된다.

Commons Logging , SLF4j -> Logback

 

아래 Maven 항목을 살펴보면 

jul-to-slf4j, log4j-to-slf4j와 같이 결국 slf4j를 호출하게 되고 slf4j-api를 통해 logback을 이용하는 것을 확인할 수 있다.

 


이제 로그 내용을 확인해 보자

아래 로그는 doc 문서에서 내용을 가져왔다. Log Format

2014-03-05 10:57:51.112  INFO 45469 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/7.0.52
2014-03-05 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2014-03-05 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1358 ms
2014-03-05 10:57:51.698  INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2014-03-05 10:57:51.702  INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]

로그 형식은 아래 순서대로 표기된다.

1. 날짜

2. log level - ERROR, WARN, INFO, DEBUG, or TRACE

3. Process ID

4. --- : 구분 문자열

5. 쓰레드 이름

6. 로거 이름, 보통 class파일의 경로를 나타낸다

 


이번에는 로그에 색을 입혀 보자.

properties파일과 같은 설정 파일에서 아래 항목을 지정해주면 된다.

값은 always, detect, never를 사용할 수 있다. 내용은 문서를 참조하자.

Spring.output.ansi.enabled=always

 


로그 내용을 별도의 파일에 기록해보겠다.

아래와 같이 path 또는 file의 값을 지정하여 로그 기록 방식과 로그를 기록할 대상을 결정하게 된다.

logging.path={디렉토리}
logging.file={파일이름}

'logging.path=logs'와 같이 지정하게 되면 해당 디렉토리에 spring.log 파일을 생성하여 로그를 기록하게 된다.

 

기본적으로 로그 파일이 10MB가 되면 rotate 되며 'logging.file.max-size' 프로 퍼티를 지정하여 max 사이즈를 지정할 수 있다. 또한 'logging.file.max-history' 프로퍼티를 이용하여 기록할 파일의 기간을 지정 가능하다.

logging.file.max-history=
logging.file.max-size=

 

 

File Output 레퍼런스

 

 

 


패키지 별로 로그 레벨을 지정해 보자.

정확하게는 class에 생성된 로거의 레벨을 지정하는 것이다.

아래와 같이 'logging.level.<logger-name>=<level>' 형태로 지정하면 된다.

logging.level.<logger-name>=<level>
logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR

 

예를 들어 이전 포스팅에서 생성한 SampleRunner.java에서 로거를 생성해 보자

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component
public class SampleRunner implements ApplicationRunner {

    private Logger logger = LoggerFactory.getLogger(SampleRunner.class);

    @Autowired
    private String hello;

    @Autowired
    private MyProperties myProperties;

    @Override
    public void run(ApplicationArguments args) throws Exception {

        logger.warn("============================");
        logger.info(hello);
        logger.debug(myProperties.getName());
        logger.info(myProperties.getFullName());
        logger.warn("============================");

    }
}

 

SLF4j를 이용한 로거를 생성하고 logger를 이용하여 warn, info, debug 등의 level로 로깅을 해 보았다.

이제 이 클래스를 property에 지정해 보자.

my.name = hongjun
Spring.output.ansi.enabled=always
logging.path=logs
logging.level.com.hongjun423.springinit=DEBUG

로깅 level을 DEBUG로 지정하였으므로 모든 로그가 기록될 것이다.

다음은 결과 화면이다.

 

Log Level에 관한 문서도 한번 읽어보자.

 

 


링크

해당 포스팅은 백기선님의 인프런 강좌를 참고하여 작성하였습니다.

 

 

 

 

 

 

반응형

댓글