사용하는 이유

로그를 사용하고 싶을 때, System.out.println()을 사용해도 원하는 기능을 얻을 수 있을 것이다. 그럼에도 Slf4j를 사용하여 얻을 수 있는 이점이 있다.

 

1. 더 많은 내용을 얻을 수 있다.

System.out.println()
Slf4j

System.out.println()과 Slf4j를 사용했을 때의 로그 차이이다. 차이를 보면 다음과 같다.

1. 찍히지 않는 실행한 스레드

2. 클래스 이름

3. message가 출력이 된다.

 

 

2. 로그의 레벨을 정할 수 있다.

log는 trace, debug, info, warn, error를 제공합니다.

 

예를들어, 아래와 같은 기준을 두며 로그의 레벨을 정할 수 있습니다.

debug는 개발서버에서 보는 것이다.
info는 비즈니스로직이기 때문에 운영시스템에서 봐야한다.

 

또한, application.properties 설정에서 패키지별로 로그의 레벨을 따로 정할 수 있습니다.

# hello.springmvc 패키지와 그 하위 로그 설정
logging.level.hello.springmvc=trace

위와같이 코드를 작성하면, hello.springmvc 하위 패키지에 있는 log는 trace로그부터 찍히도록 할 수 있습니다.

 

참고로 기본은 info이고, trace -> debug -> info -> warn -> error 순으로 찍을 수 있습니다.

 

예를들어, trace로 설정하면 trace, debug, info, warn, error의 모든 로그가 찍히고,

debug로 설정하면 debug, info, warn, error의 모든 로그가 찍힙니다.

 

그렇기때문에 spring boot 로그는 기본을 info로 두고있습니다. 실제로 trace로 변경해보면 기존에 보이지않던 수 많은 로그가 찍히는 것을 볼 수 있습니다.

 

 

3. 콘솔에만 출력하는 것이 아닌, 파일이나 네트워크 등 별도의 위치에 남길 수 있다.

 

4. 성능이 우세하다.

 

 

 

 

사용하는 방법

어노테이션 X

package hello.springmvc.basic;

import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LogTestController {

    @GetMapping("/log-test")
    public String logTest() {
        String name = "spring";

        log.trace("trace log={}", name);
        log.debug("debug log={}", name);
        System.out.println("info log =" + name);
        log.info("info log= {}", name);
        log.warn("warn log={}", name);
        log.error("error log= {}", name);
        return "ok";
    }
}

 

어노테이션 O

package hello.springmvc.basic;

import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class LogTestController {

    @GetMapping("/log-test")
    public String logTest() {
        String name = "spring";
        
        log.trace("trace log={}", name);
        log.debug("debug log={}", name);
        System.out.println("info log =" + name);
        log.info("info log= {}", name);
        log.warn("warn log={}", name);
        log.error("error log= {}", name);
        return "ok";
    }
}

 

어노테이션을 사용한 코드와 사용하지 않은 코드의 차이점을 보면

private final Logger log = LoggerFactory.getLogger(getClass());

가 있습니다. 실제로 @Slf4j의 기능은 위의 한줄의 코드를 줄여준다고 보면 됩니다.

 

 

"trace log ="+name으로 로그를 찍지 않는 이유       

 

만약 로그 레벨을 info로 설정한 경우 trace와 debug의 로그는 출력이 되지 않을 것 입니다.

 

하지만 로그를 "info log ={}", name의 방식이 아닌 "trace log ="+name으로 사용하는 경우, java는 "trace log ="+name를 읽고 cpu와 memory를 할당하지만, 실제로는 로그가 찍히지 않기 때문에 불필요한 cpu와 메모리를 낭비하게 됩니다.

 

반면, "info log = {}", name 방식을 사용하는 경우는 cpu와 메모리를 미리 할당하지 않는다고 합니다. 그렇기때문에 "info log ={}", name과 같은 방식을 사용합시다!

 

 

 

 

나중 공부를 위한 링크

1. slf4j

 

SLF4J

Simple Logging Facade for Java (SLF4J) The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks (e.g. java.util.logging, logback, log4j) allowing the end user to plug in the desired logging framewor

www.slf4j.org

2. logback

 

Logback Home

Logback Project Logback is intended as a successor to the popular log4j project, picking up where log4j 1.x leaves off. Logback's architecture is quite generic so as to apply under different circumstances. At present time, logback is divided into three mod

logback.qos.ch

3. 스프링부트가 제공하는 로그 기능

 

Core Features

Spring Boot lets you externalize your configuration so that you can work with the same application code in different environments. You can use a variety of external configuration sources, include Java properties files, YAML files, environment variables, an

docs.spring.io

 

+ Recent posts