728x90
반응형
로깅의 필요성
- 로깅이란, 시스템의 상태 및 동작 정보를 시간 경과에 따라 기록하는 것을 의미한다.
- 로깅을 통해 개발자는 개발 과정 혹은 개발 후에 발생할 수 있는 애플리케이션의 문제를 진단하고 추적할 수 있다.
- 로깅 과정에서 결정해야 할 사항 중 하나는 로그 수준을 어느정도로 제한하는가? 이다. 애플리케이션의 세부 내용까지 로깅하면 상세한 로그들이 지나치게 많이 출력되어 가독성도 떨어지고 처리도 어렵다.
- 로깅 메시지는 대부분 파일 혹은 콘솔에 기록되기 대문에 I/O의 메모리를 잡아먹는다. 이러한 부분을 고려하여 수준을 정해야 한다.
스프링에서의 로깅
- 스프링의 강력한 장점중 하나인 PSA(Portable Service Abstraction)을 사용하여 JCL(Jakarta Commons Logging)을 사용해서 로깅을 구현했다.
덕분에 JCL을 사용하면 기본 인터페이스인 Log와 Log객체 생성을 담당하는 LogFactory를 구현하는 것으로 언제든 로깅 구현체의 교체가 가능하다. - JCL은 LogFactory를 토앻 불러온 로깅 구현체를 런타임 시점에 로딩하여 사용한다.
- SL4J는 JCL의 런타임 로딩 문제 해결을 위해 컴파일 시점에 구현되도록 구현하고 도입하였다.
- 현재는 SL4J라는 새로운 로깅 인터페이스 기반의 구현체를 사용한다.
- Lombok을 함께 사용하면 단순하게 구현 가능하다.
JCL사용시
public class SampleClass {
Logger log = LoggerFactory.getLogger(this.getClass().getName());
public void sampleMethod() {
log.info("This is an logging message");
// ...
}
}
Lombok을 사용한 @Sl4j 사용
- 다만 SL4J구현체들은 JCL인터페이스를 구현하지 않으므로 JCL환경에서는 바로 사용할 수 없다.
- JCL 과 SL4J를 사이로 어댑터를 필요로 한다.
- Logback, Log4j2를 사용하기 위해 스프링 부트가 jcl-over-slf4j 라이브러리 의존성을 갖는 이유다.
@Slf4j
public class SampleClass {
private void init() {
log.info("Sample Class is initialized!!!");
}
}
Log4j와 LogBack, Log4j2중 뭘 사용해야 할까?
- 구글링을 많이 해본 결과 Log4j2를 사용한다. 2021년에 배포된 특정 버전에서 심각한 보안 결함이 있어 LogBack을 주로 사용햇지만 현재는 보완되어 Log4j2를 더 많이 사용한다.
- Log4j2는 Log4j의 후속버전이다. 스프링 부트에는 기본 탑재되어 있지 않으므로 log4j나 logback 라이브러리를 제거하고 그 자리에 대신 사용해야 해서 다소 번거로운 단점이 있다.
- 하지만 그만큼 강력한 기능을 제공한다. Async Appender, Async Logger등 비동기 옵션을 제공해서 상당한 퍼포먼스를 보여주어 대용량의 트래픽을 다루는 경우 더 좋은 선택이 될 수 있다.
- 아래 자료를 참고하면 쓰레드가 늘어날 수록 Log4j2의 성능이 훨씬 우월함을 보여주고 있다.
- 하지만 주의할 점이 있다. 비동기 로거를 사용할 경우 버퍼에 로그를 우선 저장하기 때문에 Flush되지 않은 로그는 유실될 수 있다는 단점이 있다.
## SpringBoot에서 LogBack대신 Log4j2적용하기
- spring에서는 logback이 기본 설정이기 때문에, 해당 라이브러리를 제거하고 사용해야 한다.
configurations {
all {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
}
- 그 이후 의존성을 추가한다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-log4j2'
}
이렇게 하면 consle에서 logback으로 보이던 내용이 log4j로 변경된것을 확인할 수 있다.
확인은 아래 코드를 적용해서 실행해주면된다.
log.info("log = {}", log.getClass());
변경전
변경 후
728x90
반응형
'Spring' 카테고리의 다른 글
테스트 코드의 기본 이론 (1) | 2024.11.16 |
---|---|
[Spring/ 환경변수 설정] 로컬에서 IntelliJ 환경변수 설정하기 (0) | 2024.08.12 |
[Lombok] Builder란? toBuilder를 사용해서 DB 내용 수정하기 (0) | 2024.07.04 |
[Spring] AOP의 개념, AsertJ와 차이점, 실습해보기 (1) | 2024.06.10 |
[Spring] Spring Batch - 일정한 시간에 회원 유효성 검사하기 (0) | 2024.06.10 |