[Spring] Slf4j로 로그 남기기

Yujeong·2024년 1월 28일
post-thumbnail

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

로그 사용시 장점

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

  • 기록
    System.out 콘솔에만 출력하는 것이 아니라, 파일이나 네트워크 등, 로그를 별도의 위치에 남길 수 있다. 특히 파일로 남길 때는 일별, 특정 용량에 따라 로그를 분할하는 것도 가능하다.

  • 레벨
    애플리케이션을 건들지 않고, 로그 레벨을 설정하여 로그 상황에 맞게 조절할 수 있다.

  • 성능
    성능이 내부 버퍼링, 멀티 스레드 등에서 System.out보다 좋다. 그래서 실무에서는 꼭 로그를 사용해야 한다.

로깅 라이브러리

로깅 테스트 해보기

@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";
    }
}
  1. Logger 사용하기

    • 로그 레벨 설정: trace > debug > info > warn > error

    • 기본 로그 레벨: info

      # 전체 로그 레벨 설정(기본 info)
      logging.level.root=info
    • trace, debug는 나오지 않는다.

    • debug도 나오고, trace는 나오지 않는다.

      <application.properties>
      #com.yujeong.springmvc 패키지와 그 하위 로그 레벨 설정
      logging.level.com.yujeong.springmvc=debug

    • error로 설정하면 ERROR 레벨만 출력된다.

  1. Slf4j 사용하기

    • 매번 아래 코드를 생성해서 사용하는 것은 번거로운 일이다.
    private final Logger log = LoggerFactory.getLogger(getClass());
    • lombok에서 제공해주는 slf4j 애노테이션을 사용하면 편리하게 사용할 수 있다.
    @Slf4j
    @RestController
    public class LogTestController {
    
        @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";
        }
    }
  2. 다음 두 코드의 차이는 무엇일까?

    log.trace(" trace my log="+ name); //1번
    log.trace(" trace my log={}", name); //2번
    • 1번: 연산이 일어나면서 “ trace my log=name”이 된다. 그리고 메모리와 cpu를 사용한다. 그러나 로그 레벨은 debug로 설정하였기 때문에 trace를 사용하지 않을 텐데, 쓸모없는 연산을 통해 리소스를 사용하게 된다.
    • 2번: 파라미터를 넘기는 방식이다. 로그 레벨이 debug이기 때문에 trace를 보고 파라미터를 넘기지도 않고 패스한다.

결론

  1. System.out 대신 slf4j 사용해 로그 남기기
  2. 개발 서버는 debug, 운영 서버에서는 info로 설정하여 중요한 정보만 남기기
  3. 로그를 남길 때는 문자열 연결 방식보다 문자열 포맷팅 방식을 사용하기

참고
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

profile
공부 기록

0개의 댓글