1. 스프링 부트에서 로깅 사용법


스프링 부트는 spring- boot-starter-logging을 기본적으로 제공한다

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Configuration
public class RedisScheduler {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    private void log(String name) {
        logger.trace("trace log={}", name);
        logger.debug("debug log={}", name);
        logger.info(" info log={}", name);
        logger.warn(" warn log={}", name);
        logger.error("error log={}", name);
    }
}

1.1.1. {}, xxx 문법을 사용하는 이유

위에 예제 코드를 보면, logger.trace("trace log={}", name)로 되어있다.
logger.trace(”trace log=” + name)으로 사용하면 안될까?
사용하면 안되는데 이유를 알아보자.

  1. 의미없는 문자열 연산이 일어난다. 반면 name을 파라미터로 넘기면, 연산이 일어나지 않는다.
  2. 로그 레벨에 따라서 출력되지 않는 로그 레벨의 문자열 연산이 일어난 후 로그 레벨을 검사한다.
    만약 debug 레벨인 경우 trace는 아예 동작할 필요가 없기 때문에 trace는 검사만 하고, 출력하지 않는다.
    하지만 문자열 연산이 있으면, 문자열 연산을 하고 레벨을 검사하는 것이다.

1.1.2. 로그 레벨 설정하기

application.properties

logging.level.project=debug

debug 레벨로만 설정하면 하위 레벨은 로깅되지 않음. 즉, trace는 로깅되지 않음.
별도로 설정하지 않는다면, info가 기본값.

logging.level.root=debug

기본값은 이렇게 root에 debug가 아닌 info가 되어있다고 했다.
만약 debug나 trace로 변경하면, 라이브러리들의 모든 로그까지 다 로깅하기 때문에
필요한 경로에 별도로 지정해서 사용하자.

1.1.3. 로그 레벨

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

2. 로그 설정 팁


2.1.1. 개발 서버는 debug

디버깅에 필요한 상세 정보를 봐야하기 때문이다.
디버깅이 더 상세한 정보를 보여주기도 하고, 개발 중 작성한 로그가 실수로 운영에도 반영되는 일이 방지할 수 있음.
실제로 이런 경우가 많음. System.out.println은 방법이 없음.

2.1.2. 운영 서버는 info

운영 서버에서 디버깅은 필요없고 기본 정보나 에러가 발생할 경우만 로그가 필요하기 때문이다.
트래픽도 많기 때문에 의미없는 로그는 없애야하기 때문이다.

3. Log 라이브러리 사용하는 이유


대표적으로 SLF4J 인터페이스있고, Logback, log4j, log4j2 구현체가 있다.

  • 쓰레드 정보, 클래스 이름 같은 부가 정보를 함께 볼 수 있다.
  • 출력 모양을 가독성 좋게 변경할 수 있다.
  • 로그 레벨에 따라 환경에 맞게 설정할 수 있다.
  • 콘솔에만 출력이 아닌 네트워크, 파일로도 남길 수 있다.
  • 파일로 남길 때는 특정 용량에 따라 로그를 분리하는 것도 가능하다.
  • 성능도 일반 System.out보다 수십배 차이가 난다고 한다.

 

 

출처 : https://dev-monkey-dugi.tistory.com/

+ Recent posts