로그란?
- 로그는 프로그램의 동작을 추적해 문제를 해결하거나 성능을 분석하기 위한 목적으로 활용됩니다.
- 스프링 부트는 기본적으로 로그백(Logback)이라는 로깅 도구를 사용하여 관리합니다.
SLF4J
- SLF4J는 다양한 로그 프레임워크 (java.util.logging, logback, log4j)를 Facade 해주는 추상화 라이브러리입니다.
- 로깅 프레임워크 간 마이그레이션을 가능하게 한다.
SLF4J는 세가지 구성요소를 갖습니다.
- SLF4J API
- SLF4J 를 사용하기 위한 인터페이스를 제공
- slf4j-api-{version}.jar 를 통해 사용
- 반드시 slf4j 바인딩은 하나만 사용한다
- SLF4J Binding은 SLF4J 인터페이스( = SLF4J API )를 로깅 구현체와 연결하는 어댑터 역할의 라이브러리
- SLF4J 바인딩
- SLF4J 인터페이스를 로깅 구현체(logback 또는 log4j2)와 연결하는 어댑터 역할의 라이브러리
- SLF4J Bridging Modules
- 다른 로깅 API로 Logger 호출을 할 때, SLF4J 인터페이스로 연결(redirect)하여 SLF4J API가 대신 Logger를 처리할 수 있도록 하는 어댑터 역할의 라이브러리
- 다른 로깅 API ==> Bridge(redirect) ==> SLF4J API
로그 방법
1. System.out.println()
2. java.util.loggin.Logger
장점
단점
- 다른 라이브러리에 비해 속도가 느립니다.
- custom 레밸에서 메모리 누수가 일어납니다.
- Predefine 된 레벨의 개념이 명확하지 않습니다.
3. Log4j
- 2015년 기준 개발 중단.
- 가장 오래된 로깅 프레임워크
- Apache의 Java기반 로깅 프레임워크
- properties/xml 설정 파일을 통해 환경을 구성
- 성능이 더 개선된 log4j2를 주로 사용합니다.
4. Log4j2
- Facad 패턴으로 구현되어 다른 로깅 라이브러리와 사용 가능합니다.
- 다른 로깅 라이브러리에 비해 비동기 성능이 뛰어납니다.
- 파일뿐만 아니라 HTTP, DB, Kafka에 로그를 남길 수 있습니다.
- Automatic Reloading 기능을 제공하여 별도에 재시작없이 설정을 변경하여 사용할 수 있습니다.
5. LogBack
-
SLF4J 구현체로 SpringBoot의 기본 log로 사용
-
spring-boot-starter-web안에 spring-boot-starter-logging의 logback이 기본적으로 포함
-
Automatic Reloading 기능 지원
-
기본 로그백을 사용하면 문제점
- 다시 실행할 경우 이전 로그가 삭제됩니다.
- 로그가 쌓일수록 로그 파일의 용량이 무한대로 증가합니다.
- 로그 시간이 시스템 시간이 아닌 UTC 시간으로 출력됩니다.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
class LogbackLogger {
private static Logger logger = LoggerFactory.getLogger(LogbackLogger.class);
void method() {
logger.trace("Trace");
logger.debug("Debug");
logger.info("Info");
logger.warn("Warn");
logger.error("Error");
}
}
로그 레벨
- trace : debug 보다 훨씬 상세한 정보를 기록할 경우에 사용 (주로 디버깅에서 사용)
- debug : 디버깅 목적으로 사용
- info : 주요 이벤트나 상태 등의 정보를 출력 목적으로 사용
- warn : 문제가 발생할 가능성이 있는 상태를 경고하는 정보 출력
- error : 심각한 문제나 예외 상황 등에 대한 오류 정보를 출력
- fatal : 프로그램 기능의 일부가 실패하는 등 아주 심각한 문제에 관한 정보 출력
결론
- 멀티 스레드 환경에서 로깅 양이 많고 로깅 성능이 중요한 경우 Log4j2를 사용하는 것을 고려해 볼 수 있습니다.
- SLF4J를 활용해 Logback과 Log4j2 간의 마이그레이션을 편리하게 사용할 수 있습니다.
- 저는 토이프로젝트를 진행하고 있기 때문에 Spring Boot의 기본 포함된 LogBack과 SLF4j를 사용하려고 합니다.
참고자료
SLF4J
Logging :: Spring Boot