로깅 알아보기

바그다드·2023년 4월 22일
0
post-thumbnail
  • 실제 운영 시스템에서는 System.out.println()같은 메서드를 사용하지 않고 로깅 라이브러리를 이용해서 로그를 기록한다. 따라서 로깅에 대해서 알아보자

  • 스프링 부트에서는 기본적으로 spring-boot-starter-logging라이브러리가 포함되는데, 이 라이브러리는 SLF4J라는 인터페이스로 제공되고, 구현체로는 대부분 Logback이 사용된다.

LogTestController생성

  • 로그를 테스트 해보기 위해 간단한 RestController를 만들어보자
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class LogTestController {
    // 직접 선언
//    private final Logger log = LoggerFactory.getLogger(getClass());

    @GetMapping("/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";
    }
}
  • Logger의 타입에 주의하자
  • Logger를 선언하는 방법은 직접 선언하는 방식과, 롬복의 @SLF4J를 사용하는 방법이 있다.
  • 코드를 보면 trace~error까지 여러 종류의 로그가 있는데, 설정에 따라 log를 출력하는 레벨을 설정할 수 있다. application.properties에 아래의 코드를 추가해주자
    값으로는 trace > debug > info > warn > error가 들어갈 수 있다.
#전체 로그 레벨 설정(기본info)
logging.level.root=info


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

trace로 설정시 모든 로그를 확인할 수 있다.
trace로 설정시
debug로 설정시 debug 레벨 로그만 확인할 수 있다.
debug로 설정시
info로 설정시
info로 설정시

  • 코드에서는 trace레벨부터 error레벨까지 모두 정의해놓았는데 설정 값에 따라 찍히는 로그가 달라지는 것을 확인할 수 있다.
    - 때문에 일반적으로 개발 환경에서는 debug로, 로컬pc환경에서는 trace나 debug로, 운영 서버에서는 info로 설정하여 로그를 기록한다.
    운영 서버에서 모든 로그를 찍으면 너무 많은 로그가 찍히게 된다.
  • 해당 url로 접근해보면 콘솔에 위와 같이 찍히는 것을 확인할 수 있는데, System.out.println()을 이용해 찍은 정보보다 훨씬 자세한 정보가 찍히는 것을 확인할 수 있다.

로그의 올바른 사용법

  • 컨트롤러를 다시 확인해보자
		String name = "Spring";
		// 올바르지 못한 사용법
		log.trace("trace log="+ name);
        // 올바른 사용법
        log.trace("trace log={}", name);
  • 첫번째의 경우 trace메서드를 호출하기 전에 "trace log="+ name 이 부분을 "trace log=Spring"이라는 형태로 연산을 하고 trace메서드로 넘긴다. 그런데 현재 설정이 info레벨의 로그만 찍히도록 설정해 놓았기 때문에 위의 로그는 찍히지 않을 것인데, 연산이 모두 이뤄지고 나서 메서드를 호출하게 되기 때문에 효율성 측면에서 좋지 않다.
  • 두번째의 경우에는 trace메서드의 인자값으로 trace log={}", "Spring"의 형태로 그대로 넘기기 때문에 별다른 연산도 일어나지 않고 로그로도 찍히지 않는다. 따라서 올바른 형태로 로그를 사용하자!!!

로그 사용시 장점

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

0개의 댓글