ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] 로깅(Logging) 간단하게 알아보기
    Back-end/Spring 2022. 3. 21. 12:37

    안녕하세요 이번 포스팅은 로깅에 대해서 알아보겠습니다!!

     

    운영 시스템에서는 System.out.println() 같은 시스템 콘솔을 사용해서 필요한 정보를 출력하지 않고, 별도의 로깅 라이브러리를 사용해서 로그를 출력합니다. 참고로 로그 관련 라이브러리도 많고, 깊게 들어가면 끝이 없기 때문에, 여기서는 최소한의 사용 방법만 알아봅시다.

     

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

     

     

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

     

     

    또한 간편하게 @Slf4j 어노테이션을 클래스 레벨에 추가 해주면 log.log() 형태로 간편하게 실행할 수 있습니다.

     

    LogTestController

     

    import lombok.extern.slf4j.Slf4j;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    //@Slf4j
    @RestController
    public class LogTestController {
         private final Logger log = LoggerFactory.getLogger(getClass());
         
         @RequestMapping("/log-test")
         public 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";
     	}
    }

     

    테스트

    로그가 출력 되는 포맷 확인을 해보면 시간, 로그 레벨, 프로세스 ID, 스레드 명, 클래스 명, 로그 메시지를 확인할 수 있습니다.

    로그 레벨 설정을 변경해서 출력 결과를 얻을 수도 있는데 주로 개발 서버는 debug로 출력하고 운영 서버는 info로 출력한다고 합니다.

     

    올바른 로그 사용법

    log.debug("data=" + data)

    로그 출력 레벨을 info로 설정해도 해당 코드에 있는 "data="+data가 실제 실행이 되어버립니다.

    결과 적으로 문자 더하기 연산이 발생합니다.

    그래서, log.debug("data={}", data) 이런 식으로 출력을 해줘야 info 레벨에서 불필요한 연산이 일어나지 않습니다.

     

    로그 사용 시 장점

    1. 스레드 정보, 클래스 이름 같은 부가 정보를 함께 볼 수 있고, 출력 모양을 조정할 수 있습니다.

    2. 로그 레벨에 따라 개발 서버에서는 모든 로그를 출력하고, 운영서버에서는 출력하지 않는 등 로그를 상황에 맞게 조절할 수 있습니다.

    3. 시스템 아웃 콘솔에만 출력하는 것이 아니라, 파일이나 네트워크 등, 로그를 별도의 위치에 남길 수 있습니다.

    특히 파일로 남길 때는 일별, 특정 용량에 따라 로그를 분할하는 것도 가능합니다.

    4. 성능도 일반 System.out보다 좋습니다. (내부 버퍼링, 멀티 쓰레드 등등) 그래서 실무에서는 꼭 로그를 사용해야 합니다.

     

    다음 포스팅에는 스프링에서 제공하는 요청 매핑 방법에 관해 알아보겠습니다.!!

Designed by Tistory.