본문 바로가기

Spring

Log 찍기

이 내용은 김영한님의 스프링 MVC 1편 중 Log 파트를 정리하는 것

실무에서는 System.out.print() 대신에 Log를 사용한다고 함

 

스프링 부트를 사용하면 스프링 부트 로깅 라이브러리가 자동으로 포함되어 있음 spring-boot-starterlogging

 

일단 로그 테스트를 위한 클래스를 하나 만들어보자

@RestController
public class LogTestController {

    private final Logger log = LoggerFactory.getLogger(getClass()); // 혹은 LogTestController.getClass() 해도 됨

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

        return "ok";
    }
}

 

하고 localhost:8080/log-test 에 접속하게되면

println() 와 log가 같이 찍히는 모습

 

println()은 그냥 콘솔창에서 해당하는 내용만 찍히는 반면

Log는 찍힌 시간, 로그 레벨, 프로세스 ID, 실행한 Thread, 자바 Class 이름 및 경로, 로그 내용 까지

 

찍는 것은 println()과 다를 게 많이 없지만 그 이후 노출되는 정보는 많은 차이가 있다.

 

하지만 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);

 

중요도 순으로 정렬한 Log, 원하는 레벨의 Log를 필터링하여 볼 수 있음

 

이렇게 설정 후 실행하면

 

Debug, Warn, Error 만 표시되는 것을 볼 수 있다. (전체 Log의 Level 기본 값이 info)

 

하지만 Log의 출력 레벨을 조정하면 그 하위 레벨의 로그도 출력할 수 있음

application.properties 파일에서

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

 

Log의 레벨 설정을 진행하면

 

모든 로그가 다 출력되는 모습을 볼 수 있다.

 

그리고 이후 배포 시 스프링 부트의 기능을 사용하여 Log의 레벨을 조정할 수 있음

개발 할 때에는 debug 레벨을 사용 => 배포 시에는 info 레벨의 log만 남기기

 

또한 서버마다 레벨을 변경할 수 있다고 한다.

 

여기서 Lombok이 제공하는 기능 중 @Slf4j 어노테이션이 있음

@Slf4j
@RestController
public class LogTestController {

    // private final Logger log = LoggerFactory.getLogger(getClass()); // 혹은 LogTestController.getClass() 해도 됨

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

        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";
    }
}

 

@Slf4j 어노테이션을 사용하면 Log 필드를 만들지 않아도 바로 로그를 사용할 수 있음

 


로그의 올바른 사용법

두 로그 출력의 차이점을 알아보자

log.trace("trace log = " + name);
log.trace("trace log = {}", name);

 

두개의 Log 출력 결과는 똑같음

 

하지만, 시스템 사용량에서 차이가 생김

 

자바의 시스템 상 + 연산이 먼저 일어남 => 윗 줄의 로그는 출력은 안되지만 "trace log = Spring" 연산이 진행

아랫 줄의 로그는 {} 내용을 name으로 치환하는 것이기 때문에 연산 자체가 일어나지 않음

 

한두줄은 상관이 없겠지만 쌓이면 필요하지 않은 연산이 많이 생기기 때문에 이것을 주의해서 사용해야 함

'Spring' 카테고리의 다른 글

240315 도커  (0) 2024.03.15
240314 스프링 부트  (2) 2024.03.14
240313 스프링 부트  (1) 2024.03.13
240312 스프링 부트  (0) 2024.03.12
240311 스프링 부트  (0) 2024.03.11