프로그래밍 공방

[Spring] 6-1. 스프링 MVC - Logging 본문

개발/스프링

[Spring] 6-1. 스프링 MVC - Logging

hyosupsong 2021. 10. 31. 13:08

Logging

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

Logging 라이브러리

스프링 부트 라이브러리를 사용하면 스프링 부트 로깅 라이브러리(spring-boot-starter-logging)가 포함된다

스프링 부트 로깅 라이브러리는 기본으로 아래 로깅 라이브러리를 사용한다
- SLF4J (인터페이스)
- Logback (로그 라이브러리)
* 로그 라이브러리는 Logback, Log4J, Log4J2 등등 다양한 라이브러리가 있는데, 그것을 통합해서 인터페이스로 제공하는 것이 SLF4J 라이브러리이다

Logger 선언 및 사용

Logger는 아래와 같이 두 가지 방법을 통해 선언할 수 있다

public class LogTest {
    // getClass() 대신 LogTest.class 도 가능하다
    private static final Logger log = LoggerFactory.getLogger(getClass());
}

// annotation을 사용하여 생성
@Slf4j
public class LogText {

}

 

로그를 사용하는 방법은 아래와 같다

@Slf4j
@RestController
public class LogTestController {

    @RequestMapping("/log-test")
    public String logTest() {
        String text = "test";
        
        log.trace("trace log={}", text);
        log.debug("debug log={}", text);
        log.info("info log={}", text);
        log.warn("warn log={}", text);
        log.error("error log={}", text);
        
        // 아래와 같은 방식은 로그를 남기지 않는 경우에도 + 계산 로직이 먼저 실행되므로 사용하면 안된다
        log.debug("debug log=" + text);
        
        return "ok";
    }
}

스프링 부트의 로그 포맷

시간, 로그 레벨, 프로세스 ID, 쓰레드 명, 클레스 명, 로그 메시지
2021-10-31 12:57:09.037  INFO 26959 --- [main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)

로그 레벨

로그는 application.properties에서 아래와 같이 레벨을 설정하여 출력을 남길 로그의 레벨을 선택할 수 있다

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

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

일반적으로 개발 서버는 debug, 운영 서버는 info를 출력한다

로그 사용시 장점

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