Post

[Spring] 로그는 왜 남기나요?

[Spring] 로그는 왜 남기나요?

서론

우리는 어떤 언어를 배우든 콘솔창에 “Hello, World”를 출력해 보면서 학습을 시작합니다.

그러나, 운영 환경에서 콘솔창에 값을 출력하는 모습은 잘 보이지 않습니다. 또한 “로그”라는 친구를 만나게 될 텐데요.

오늘 “로그”라는 친구에 대해서 자세히 알아가 보는 시간을 가져보도록 하겠습니다.


Log가 뭔데요?

로그(Log)란, IT인프라에서 발생하는 모든 활동과 사건에 대한 기록이에요.

이를 활용하면 사용자에게 서비스를 제공할 때 발생하는 오류들의 원인에 대한 실마리를 잡을 수 있죠.

만약, 이 로그란 것이 없다면…? 서비스를 하나하나 테스트해서 오류를 찾아내야만 하는 끔찍한 상황을 마주하게 될 것입니다.


System.out.prinln()을 사용하면 되잖아요!

System.out.prinln()을 사용하면 안 될 건 없지만, 다음과 같은 이유로 지양하는 것이 좋습니다.

  1. System.out.prinln()은 휘발된다.

System.out.prinln()은 로그가 표준 출력으로 출력되기 때문에, 파일로 저장되지 않고 단순 출력으로 내용이 휘발됩니다.

로그의 용도는 오류 추적 및 해결을 위한 “기록”인데, 내용이 휘발되면 안 되겠죠?

  1. 로그 출력 레벨을 설정할 수 없다.

개발 환경에서 개발을 진행할 때에는 디버깅을 위해 로직에 대한 상세한 정보가 확인되어야 합니다.

그러나 운영 환경에서는 오류 추적에 필요한 정보만이 필요하고, 개발 환경에서 사용되는 정보에 민감한 정보가 포함될 수 있기 때문에 반드시 구분되어야 합니다.

이러한 기능이 System.out.prinln()에는 존재하지 않기 때문에 운영 환경에서의 사용은 지양됩니다.

  1. 성능 저하의 원인이 될 수 있다.

System.out.prinln()은 내부적으로 synchronized와 lock으로 thread-safe 하게 동작하도록 설계되어 있습니다.

그러나, 메서드를 호출하는 스레드가 해당 블록 내의 작업을 단일 스레드로 처리하게 만들기 때문에 여러 스레드가 동시에 이 메서드에 접근할 경우 병목 현상이 발생할 수 있습니다.

따라서 위와 같은 단점들을 보완해 주는 “로깅 라이브러리”를 사용하는 것이 좋습니다.


라이브러리가 너무 많아요! ( Log4j vs Log4j2 vs Logback )

Log4j

2001년 아파치에서 개발된 Log4j는 가장 처음 개발된 자바 기반 로깅 유틸리티입니다.

하지만 2021년 12월, “Log4Shell“이라는 엄청난 사건에 의해 사장되게 됩니다.

Logback

Logback은 Log4j와 같은 개념을 따르지만 성능을 개선하고 Slf4j를 기본적으로 지원하며, 고급 필터링 옵션 및 로깅 구성의 자동 리로딩과 같은 여러 개선 사항을 구현하기 위해 개발되었습니다.

현재 가장 인기 있는 로깅 라이브러리인 동시에 Spring Boot에서 기본적으로 지원되는 라이브러리입니다.

때문에 Logback 이외의 다른 라이브러리를 사용하기 위해서는 Logback 의존성을 제거해 줘야 정상적으로 작동합니다.

Log4j2

가장 최근에 나온 Log4j2는 Logback에 포함된 일부 개선 사항을 포함하여 Log4j에 자체 개선 사항을 제공하고, Log4j 및 Logback의 문제를 방지하여 두 프레임워크를 모두 개선하는 것이 목표입니다.

람다 표현식을 기반으로 로그 상태를 Lazy Evaluation 할 수 있고, 지연 시간이 짧은 시스템을 위한 비동기 로거를 제공하며, garbage collector 작업으로 인한 지연을 방지하기 위해 garbage가 없는 모드를 제공합니다.


결론

아파치 사에서 제공한 위의 성능 그래프를 참고하면, Logback은 Log4j보다 속도가 약 10배 빨라졌고, 메모리 효율성도 좋아졌습니다.

또한, Log4j2가 멀티 스레드 환경에서 비동기 로거의 경우 Logback에 비해 처리량이 18배 높고 대기 시간이 짧습니다.

일반적으로 Logback은 간단한 프로젝트나 간단한 로깅 요구 사항을 처리하기에 적합하고, Log4j2는 더 많은 성능을 제공하고 더 복잡한 로깅 요구 사항을 처리하는 데 적합합니다.

This post is licensed under CC BY 4.0 by the author.