오봉이와 함께하는 개발 블로그

스프링 MVC 1 - 로깅 간단히 알아보기 본문

BE/Spring

스프링 MVC 1 - 로깅 간단히 알아보기

오봉봉이 2022. 8. 13. 00:42
728x90

로깅 간단히 알아보기

운영 시스템에서는 System.out.println()같은 시스템 콘솔을 사용해서 필요한 정보를 출력하지 않는다.
별도 로깅 라이브러리를 사용해서 로그를 출력한다.

로깅 라이브러리

스프링 부트 라이브러리를 사용하면 스프링 부트 로깅 라이브러리(spring-boot-starter-logging)가 함께 포함된다.
스프링 부트 로깅 라이브러리는 기본으로 다음 로깅 라이브러리를 사용한다.

로그 라이브러리는 Logback, Log4J, Log4J2 등등 수 많은 라이브러리가 있는데, 그것을 통합해서 인터페이스로 제공하는 것이 바로 SLF4J 라이브러리다.
쉽게 이야기해서 SLF4J는 인터페이스이고, 그 구현체로 Logback 같은 로그 라이브러리를 선택하면 된다.
실무에서는 스프링 부트가 기본으로 제공하는 Logback을 대부분 사용한다.

로그 선언

  • private Logger log = LoggerFactory.getLogger(getClass());
  • private static final Logger log = LoggerFactory.getLogger(Xxx.class)
  • @Slf4j : 롬복 사용 가능

LogTestController

package hello.springmvc.basic;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LogTestController {
    private final Logger log = LoggerFactory.getLogger(getClass());

    @RequestMapping("/log-test")
    private String logTest() {
        String name = "spring";
        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);
        //로그를 사용하지 않아도 a+b 계산 로직이 먼저 실행됨, 이런 방식으로 사용하면 X
        log.debug("String concat log=" + name);
        return "ok";
    }
}
  • @RestController를 사용하는 이유
    • @Controller는 반환 값이 String이면 뷰 이름으로 인식한다.
      • 그래서 뷰를 찾고 뷰가 렌더링 됨.
    • @RestController는 반환 값으로 뷰를 찾는 것이 아니라 HTTP 메시지 바디에 입력한다.
      • 따라서 실행 결과로 ok 메시지를 받을 수 있다.

테스트

  • 로그가 출력되는지 포멧 확인
    • 시간, 로그 레벨, 프로세스 ID, 쓰레드 명, 클래스 명, 로그 메시지
  • 로그 레벨 설정을 변경
    • LEVEL : TRACE > DEBUG > INFO > WARN > ERROR
    • 개발 서버는 보통 debug 출력
    • 운영 서버는 보통 info 출력
  • @Slf4j
    • Lombok이 제공하는 기능
    • @Slf4j를 입력하면 private final Logger log = LoggerFactory.getLogger(getClass());를 따로 입력하지 않아도 된다.

로그 레벨 설정

application.properties에서 바꿀 수 있다.

# 전체 로그 레벨 설정(기본 info)
logging.level.root=info
# hello.springmvc 패키지와 그 하위 로그 레벨 설정
logging.level.hello.springmvc=debug

올바른 로그 사용법

  • log.debug("data=" + data)
    • 로그 출력 레벨을 info로 설정해도 해당 코드에 있는 "data=" + data가 실제 실행이 되어 버린다.
      • 결과적으로 문자 더하기 연산이 발생된다.
        • 쓸모 없이 리소스를 사용하게 됨.
  • log.debug("data={}", data)
    • 로그 출력 레벨을 info로 설정하면 아무일도 발생하지 않는다.
    • 큰 따옴표("")안에 중괄호 {}를 작성하고 큰 따옴표("") 밖에 쉼표(,)로 구분해서 실제 Object를 입력 하면 각 중괄호 {}가 Object로 치환되어 출력된다.

로그 사용시 장점

  • 쓰레드 정보, 클래스 이름 같은 부가 정보를 함께 볼 수 있고 출력 모양을 조정할 수 있다.
  • 로그 레벨에 따라 개발 서버는 모든 로그를 출력, 운영 서버는 출력하지 않는 등 로그를 상황에 맞게 조절할 수 있다.
  • 시스템 아웃 콘솔에만 출력하는 것이 아니라, 파일이나 네트워크 등 로그를 별도의 위치에 남길 수 있다.
    • 특히 파일로 남길 때는 일별, 특정 용량에 따라 로그를 분할하는 것도 가능하다.
  • 성능도 일반 System.out보다 좋다. (내부 버퍼링, 멀티 쓰레드 등)
  • 실무에서는 로그를 꼭 사용해야 한다.
출처 : 인프런 김영한 지식 공유자님 강의 - 스프링 MVC 1편 백엔드 웹 개발 핵심 기술
728x90
Comments