Java

[Java] 간단한 로깅(Logging) 사용 방법

cornarong 2021. 8. 1. 22:02

SLF4J 라이브러리를 이용한 로깅 방법

 

로깅 라이브러리

로그 라이브러리는 Logback, Log4J, Log4J2 등등 수 많은 라이브러리가 있는데

스프링 부트에서 이것들을 통합해서 인터페이스로 제공하는 것이 바로 SLF4J 라이브러리다.

 

* SLF4J는 인터페이스이고, Logback은 구현체이다.

 

더 자세한 내용은 아래의 링크를 확인

* SLF4J - http://www.slf4j.org
* Logback - http://logback.qos.ch

 

로그 선언

// 1번
private final Logger log = LoggerFactory.getLogger(getClass());

// 2번
private static final Logger log = LoggerFactory.getLogger(Xxx.class)

롬복을 사용하면 로그 선언을 자동으로 해주어 바로 사용할 수 있다.

클래스레벨에 @Slf4j 선언을 해주면 된다.

// 3번
@Slf4j
public class LogTestController {
}

 

로그 레벨

log level =  trace -> debug -> info -> warn -> error(가장 심각)

* 일반적으로 개발 서버는 debug, 운영 서버는 info으로 설정한다. (설정된 level 이하의 상태는 출력하지 않는다.)

(아래 설정 소스는 스프링부트 기준 src/main/resources/application.properties에 코드 설정)

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

# groupId.artifactId 패키지와 그 하위 로그 레벨 설정
logging.level.groupId.artifactId=debug;

 

올바른 로그 사용법

// 틀린 예)
log.trace("trace log=" + name);

// 옳은 예)
log.trace("trace log={}", name);

첫번째와 같은 방식으로 trace를 출력할 경우 로그 출력 자체에는 문제가 없다.

하지만 자바 문법상 "trace log="+ name이라는 문자열 더하기 연산이 먼저 일어난 후 log레벨을 확인하기 때문에 만약 해당 프로젝트의 log레벨 설정이 debug일 경우 trace는 debug이하의 log레벨이므로 출력은 하지 않지만 이미 불필요한 연산 자체가 일어난 경우가 되어 버린다.

 

두번째 방식은 SLF4J 치환문자를 사용하는 방식이다.

문자열에 중괄호를 넣어 순서대로 출력하고자 하는 데이터들을 ' , '로 구분한 후 전달하여 치환해주는 방식으로 불필요한 연산이 발생하지 않도록 한다.

 

로그 호출

@Slf4j
@RestController
public class LogTestController {

    @RequestMapping("/log-test")
    public String logTest(){
        // 로그 라이브러리 이용한 출력
        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";
    }
}

 

로그 출력

* 현재 패키지 log레벨 = debug

 

로그 사용시 장점

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

 

 

 

 

 

 


Reference

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/