인프런 김영한 강의 정리/스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

스프링 MVC - 로깅 알아보기 | System.out.println()을 사용하면 안되는 이유

백엔드 개발자 - 젤리곰 2024. 6. 1. 13:18
728x90

이전에 System.out.println()으로 로그를 찍지말라는 얘기를 들었었는데

왜 쓰면 안되는지 이유를 몰랐었다.

이번 포스팅에서는 로그를 어떻게 남겨야하는지 다뤄볼 예정이다.

 

1. 로깅 라이브러리

스프링 부트 라이브러리를 사용하면 스프링 부트 로깅 라이브러리가 포함된다.

스프링 부트가 기본 제공하는 로깅 라이브러리들

SLF4J 는 Logback, Log4J, Log4J2 등의 라이브러리를 통합한 인터페이스다.

SLF4J 인터페이스로 구현할 때, Logback을 많이 사용하는 추세다.

 

2. 로그 사용법

 

Logger를 import할 때, 여러 Logger들이 뜬다.

이때 org.slf4j를 선택해야한다.

 

package hello.springmvc.basic;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

//@Controller을 쓰면 반환값이 String일 때, view이름으로 인식함. '뷰가 렌더링'됨.
//@RestController를 쓰면 return값이 그대로 반환된다.(이 코드에선 String이 그대로 반환)
//RestAPI 만들때 핵심적인 컨트롤러
@Slf4j
@RestController
public class LogTestController {
    //private final Logger log = LoggerFactory.getLogger(getClass()); -> @Slf4j 로 대체가능

    @RequestMapping("/log-test")
    public String logTest(){
        String name = "Spring";
        System.out.println("name = " + name);

        //log를 찍을 때, log 종류에 따라 지정해줄 수 있다.
        log.trace("trace log={}", name); //추적
        log.debug("debug log={}", name); //개발서버
        log.info("info log={}", name); //정보
        log.warn("warn log={}", name); //경고
        log.error("error log={}",name); //에러


        return "ok";
    }
}

1) @RestController 를 사용한다.

@Controller를 쓰면 반환값이 String일 때, view이름으로 인식하여 뷰가 렌더링 되기 때문이다.

@RestController를 써야 return값이 그대로 반환된다.

 

2) 로그 선언법

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

이렇게 코드로 선언해줘도 되지만,

@Slf4j 애노테이션을 사용하여 대체가능하다.

 

3) log 종류에 따라, 로그 레벨을 지정해줄 수 있다.

application.properties에 설정을 하여 로그 레벨을 지정해준다.

개발서버는 debug , 로컬에서는 trace ,운영에는 info 많이 쓴다.

운영에는 트래픽이 많이 몰리는데 debug나 trace를 쓰면 너무 많은 로그들이 쌓여 시스템에 과부하가 올 수 있기 때문이다.

 

💡로그 레벨

TRACE > DEBUG > INFO > WARN > ERROR

 

✅application.properties 설정법

#전체 로그 레벨 설정(기본 info)
#trace, debug로 설정하면 어마어마한 로그가 찍힘.
logging.level.root=info

#전체 로그 레벨 설정 있어도 더 자세하게 레벨 설정한 것이 우선권가짐.
#hello.springmvc 패키지와 그 하위 로그 레벨 설정
logging.level.hello.springmvc=trace

 

✔️로그 레벨이 info일 때

INFO와 함께 하위 레벨인 WARN, ERROR로그도 함께 출력된다.

 

✔️로그 레벨이 trace일 때

TRACE의 하위 레벨이 모두 출력된다.

기본적으로 설정을 하지않으면, info레벨로 설정된다.

 

4) System.out.println을 쓰면 안되는 이유

로깅 라이브러리를 사용하면 개발, 로컬, 운영서버에 맞게 로그레벨을 설정해줄 수 있다.

System.out.println은 그런 구분 없이 모든 서버에 로그를 남긴다.

운영서버에는 모든 로그를 다 남기면 안된다..! 

운영서버에 모든 로그를 다 남기면 디버깅할 때, 엄청 지저분한 코드를 봐야한다.

 

 

 

728x90