[Spring] 로그 (SLF4J, Logback)

Woo0·2023년 10월 27일
post-thumbnail

스프링에서 필요한 정보를 출력하는 방법에는 2가지가 있다. System.out.println() 같은 시스템 콘솔을 사용하는 것과 로그를 출력하는 것이다. 이번 시간에는 로그 사용 방법에 로그의 장점에 대해 알아본다.


🍄 로깅 라이브러리

스프링 부트 라이브러리를 사용하면 spring-boot-starter-logging 라이브러리가 포함되기 때문에 별도의 라이브러리를 추가할 필요가 없다.

  • SLF4J
  • Logback

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


🍄 로그 사용

@Slf4j
@RestController
public class LogTestController {

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

    @RequestMapping("/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";
    }
}

로그 선언

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

로그 호출

  • log.info("hello")
  • System.out.println("hello")

로그를 호출하는 방법에는 2가지가 있는데 직접 호출해보면 확실한 차이를 알 수 있다. System.out.println은 메시지만 출력하지만 log.info는 시간, 프로세서 ID, 현재 실행한 쓰레드, 현재 컨트롤러 이름, 메시지와 같은 여러 정보를 출력한다.

로그 레벨

1.trace 2.debug 3.info 4.warn 5.error

로그 레벨의 중요도이다. 스프링은 기본적으로 info, warn, error를 출력한다. 스프링이 기본으로 지원하는 라이브러리에 trace와 debug 로그가 매우 많기 때문에 추천하지 않는다. info는 요청 메시지가 발생할때 warn은 서버가 위험하다는 메시지를, error는 서버에 에러가 발생했다는 의미를 부여할 수 있다.

#전체 로그 레벨 설정(기본 info)
logging.level.root=info

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

로그 레벨은 application.properties에서 설정할 수 있다. 보통 개발에서는 로그 레벨을 debug까지, 운영에는 info까지 설정한다.

올바른 로그 사용법

  • log.debug("data="+data)
    로그 출력 레벨을 info로 설정해도 해당 코드에 있는 "data="+data가 실제 실행이 되어 버린다. 결과적으로 문자 더하기 연산이 발생한다.
  • log.debug("data={}", data)
    로그 출력 레벨을 info로 설정하면 아무일도 발생하지 않는다. 따라서 앞과 같은 의미없는 연산이 발생하지 않는다.

🍄 로그 사용시 장점

  • 쓰레드 정보, 클래스 이름 같은 부가 정보를 함께 볼 수 있고, 출력 모양을 조정할 수 있다.
  • 로그 레벨에 따라 개발 서버에서는 모든 로그를 출력하고, 운영서버에서는 출력하지 않는 등 로그를 상황에 맞게 조절할 수 있다.
  • 콘솔에만 출력하는 것이 아니라, 파일이나 네트워크 등, 로그를 별도의 위치에 남길 수 있다.
  • 특히 파일로 남길 때는 일별, 특정 용량에 따라 로그를 분할하는 것도 가능하다.
  • 성능이 일반 System.out보다 좋다. (내부 버퍼링, 멀티 쓰레드 등등)

출처: 스프링 MVC 1편 (김영한)

profile
실패를 두려워하지 않는 백엔드 개발자가 되기 위해 노력하고 있습니다.

0개의 댓글