티스토리 뷰

Spring/Spring Boot

Logging

woo'^'chang 2022. 6. 16. 22:19

Logging

로그 목적

로그란? 모든 현상과 동작 정보를 시간 경과에 따라 기록한 데이터를 의미한다.

 

이러한 로그를 잘 남기는 것은 개발에 있어서 중요한 역할을 하게 된다. 개발 시 에러를 확인하고 해결할 수 있고 개발을 진행함에도 도움을 준다. 또한 해당 데이터를 바탕으로 마케팅을 할 수 있으며 보안 측면에서도 사용할 수 있다.

 

장점들로 인해 모든 것을 로그로 기록하게 된다면 너무 방대한 양의 로그 파일이 생성되는 문제가 발생하고 의미 있는 정보를 얻을 수 없다. 그렇기에 로그를 효율적으로 남기는 것이 중요하다.

간단한 로그

Spring에서 가장 간단하게 로그를 남기는 방법은 System.out.println을 사용하는 것이다. 콘솔창을 통해 출력 결과를 쉽고 빠르게 확인할 수 있다는 장점이 존재한다.

해당 메서드를 직접 살펴보면 synchronized로 동기화되어 있는 것을 확인할 수 있다. 기록을 남길 때마다 Thread에 Lock이 걸리기 때문에 성능 저하로 이어진다. 개발단계에서는 사용할 수 있으나 실제 운영단계에서는 이를 모두 삭제해줘야 낭비되는 리소스가 줄어든다.

Logging

Spring에서는 이를 위해서 로그 프레임워크를 제공한다. 기본적으로 제공되는 로그 프레임워크가 존재하지만, 필요에 의해 원하는 프레임워크로 변경하여 사용할 수 있다. 대표적인 로그 프레임워크는 다음과 같다.

  • Logback
  • Log4j
  • Log4j2

로그 프레임워크의 간편한 변경을 위해서는 추상화된 인터페이스가 필요한데 이것이 바로 SLF4J이다. 다양한 로그 프레임워크를 위한 인터페이스로 배포 시 원하는 로그 프레임워크 연결이 가능하다.

 

Spring Boot에서 기본적으로 제공하는 프레임워크는 Logback으로 Log4j의 후속 프로그램으로 다른 로깅 프레임워크 간 전환이 쉽고, Logback 코어 위에 사용자 모듈을 쉽게 올릴 수 있다는 장점이 존재한다. 실제 실무에서도 Logback을 주로 사용한다고 한다.

 

Log4j → Logback으로 전환이 필요한 이유도 다음과 같이 설명하고 있다.

  • 더 빠르게 실행되고 메모리 소모도 적다.
  • 테스트 수준이 광범위하고 견고하고 신뢰성이 높다.
  • 이전 로그 아카이브를 자동으로 삭제해주고 로그 아카이브를 압축해서 관리한다.
  • 환경에 따른 로그 설정을 조건부로 처리할 수 있다.

Log Level

로그 레벨이란 로그 메시지의 심각도 또는 중요도를 나타내는 정도이다. 로그 프레임워크마다 별도의 로그 레벨을 가지고 있는데 Logback의 로그 레벨을 살펴보면 다음과 같다.

Trace

  • 가장 세부적이고 디테일한 정보를 나타낸다.

Debug

  • 개발 단계에서 주로 사용하며, SQL 로깅이 가능하다.
  • 프로그램을 디버깅하기 위한 정보를 출력한다.

Info

  • 애플리케이션의 현상과 동작을 나타내는 기본 로그 레벨이다.
  • 운영에 참고할만한 비즈니스 프로세스를 출력한다.

Warn

  • 로직 상 유효성을 확인하고 예상 가능한 문제로 인한 예외 처리를 출력한다.
  • 당장 애플리케이션에 문제는 없지만 주의해야 할 부분을 담고 있다.

Error

  • 예상하지 못한 심각한 문제가 발생하여 즉시 조치를 해야 하는 부분을 출력한다.

실습

Slf4j

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

public static void main(String[] args) {
    Logger log = LoggerFactory.getLogger(LogTestController.class);
    System.out.println("hello");
    log.info("hello");
}

LoggerFactorygetLogger 메서드를 통해 Logger를 얻을 수 있다.

 

Logger에는 로그 레벨을 설정하여 출력할 수 있는 trace(), debug(), info(), warn(), error() 메서드가 오버라이드 되어 있다.

출력 결과는 다음과 같이 확인할 수 있는데 출력 날짜, [스레드명], 로그 레벨, 로거 이름, 로그 메시지 순으로 출력된다.

@Slf4j

이를 조금 더 간편하게 사용하기 위해서는 lombok 라이브러리를 사용할 수 있다. build.gradle 파일에 lombok 라이브러리 의존성을 추가한다.

// build.gradle

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

IntelliJ에서 사용하기 위해서는 추가로 annotation processing을 Enable 해줘야 한다.

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class LogTestController {

    public static void main(String[] args) {
        log.info("hello");
    }

}

@Slf4j 애노테이션을 사용하게 되면 별도의 Logger객체 생성없이 log를 바로 사용할 수 있다.

Spring Server를 시작하게 되면 보이게 되는 로그 출력인데 Log에 대한 개념을 조금 더 이해하고 나니 서버가 시작되고 나서 어떤 동작이 진행되는지 직관적으로 이해할 수 있었다.

로그 레벨 변경

srcmainresourcesapplication.properties에서 로그 레벨을 변경할 수 있다. 기본값으로는 logging.level.root=info로 지정되어 있다. 이를 경로에 따라, 개발/운영에 따라 구분하여 지정이 가능하다.

// 루트 경로의 로그 레벨을 info로 지정
logging.level.root=info

// com.logging 하위 경로의 로그 레벨을 debug로 지정
logging.level.com.logging=debug

경로에 대한 중복되는 설정이 발생하는 경우 구체적인 경로를 명시한 설정을 따르게 된다.

로그 설정

Spring Boot는 로그 설정 파일 정보를 다음과 같은 순서로 찾게 된다.
  1. resources 경로의 logback-spring.xml 파일을 읽는다.
  2. 만약 존재하지 않는다면 application.properties를 읽는다.
  3. 같이 있으면 모두 적용되지만 application.properties가 우선 적용된다.

 

해당 파일에서는 다음과 같은 설정을 진행할 수 있다.

  • 로그 파일 생성
  • 로그 파일 관리
  • 로그 패턴 설정

소스 코드

 

GitHub - woo-chang/spring-lab: Spring 실험 및 학습 Repo

Spring 실험 및 학습 Repo. Contribute to woo-chang/spring-lab development by creating an account on GitHub.

github.com

 

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Total
Today
Yesterday