티스토리 뷰
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");
}
LoggerFactory
의 getLogger
메서드를 통해 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에 대한 개념을 조금 더 이해하고 나니 서버가 시작되고 나서 어떤 동작이 진행되는지 직관적으로 이해할 수 있었다.
로그 레벨 변경
src
→ main
→ resources
→ application.properties
에서 로그 레벨을 변경할 수 있다. 기본값으로는 logging.level.root=info로 지정되어 있다. 이를 경로에 따라, 개발/운영에 따라 구분하여 지정이 가능하다.
// 루트 경로의 로그 레벨을 info로 지정
logging.level.root=info
// com.logging 하위 경로의 로그 레벨을 debug로 지정
logging.level.com.logging=debug
경로에 대한 중복되는 설정이 발생하는 경우 구체적인 경로를 명시한 설정을 따르게 된다.
로그 설정
Spring Boot는 로그 설정 파일 정보를 다음과 같은 순서로 찾게 된다.
- resources 경로의 logback-spring.xml 파일을 읽는다.
- 만약 존재하지 않는다면 application.properties를 읽는다.
- 같이 있으면 모두 적용되지만 application.properties가 우선 적용된다.
해당 파일에서는 다음과 같은 설정을 진행할 수 있다.
- 로그 파일 생성
- 로그 파일 관리
- 로그 패턴 설정
소스 코드
'Spring > Spring Boot' 카테고리의 다른 글
복합키를 가지는 JPA 엔티티 생성하기 (1) | 2022.09.14 |
---|---|
[Spring Boot] 메시지, 국제화란 (0) | 2022.07.30 |
[Error] 406 Not Acceptable HttpMediaTypeNotAcceptableException (0) | 2022.07.29 |
@RequestBody, @ResponseBody (2) | 2022.06.16 |
MVC 어댑터 패턴 (1) | 2022.06.16 |