thumbnail
[Spring Boot] log4j2 적용기
Spring Boot / logging
2024.08.22.

1. 기존의 로그작성

기존에는 개발하면서 그때그때 로그를 System.out.println("url" + url); 이런식으로 작성했다. 원래는 디버깅 도구를 활용해서 변수를 확인하는 버릇을 들여야겠지만.. 업무 특성상 가끔 수정이 들어가는 백엔드에 그때그때 확인이 필요한 변수만 표출하는게 효율적(?)이라고 생각을 한것 같다. 사실 이클립스 IDE자체가 맘에안들어서 디버깅 도구사용도 귀찮은것도 있었다

아무튼.. 이런식으로 프론트엔드와 Data API 와 상호작용하면서 테스트 하다보니 java언와 javascript 언어 특성의 차이로 인해서 매번 타이핑 하는게 귀찮게 느껴져서 로거를 적용해봐야 겠다는 생각이 들었다. 어차피 배포판에서도 로거가 있으면 활용도가 늘어나기도 할 것이다. (이거 완전 럭키비키잖아?)

아, 위에서 말한 언어의 차이를 간단히 코드로 보면 아래와 같다.

console.log(`data: ${data} url: ${url}`)
System.out.println("data:" + data + " url:" + url);

javascript에서는 백틱 리터럴을 통해 ${}로 간단하게 볼수있지만, java에서는 문자열과 변수를 매번 나눠서 처리해야해서 너무 귀찮았다. 예시에서는 2가지만 보지만, 실제로 작업하다보면 파라미터 등등… 확인해야할 변수들이 많다.


2. 로거 라이브러리 활용하기 (log4j2 )

예전 전자정부 프레임워크를 사용할 때 log4j 를 사용했던 기억이 어렴풋이 남아있다. 제일 먼저 생각나서 찾아보니 log4j2가 나왔더라.

log4j는 얼마전 보안 취약점 이슈가 있었기도 하고, Spring boot에서 log4j2 가 기본 탑재되어있다고 하니 고민도 안하고 log4j2 로 정했다.

성능, 기능, 안정성 측면에서 많은 업데이트가 있었던 것으로 보인다.


3. log4j2 적용

Spring boot에서 log4j2를 적용하는 방법은 매우 간단했다. 기본 패키지로 포함되어있어 라이브러리 추가 과정도 필요가 없었다. java 클래스 상단에 @Log4j2 추가해주고 임포트만 해주면 된다. 작업할땐 자동완성으로 해서 몰랐는데 lombok 라이브러리에 포함된거였다. 그래서 어노테이션만으로 추가가 되는 모양이다.

import lombok.extern.log4j.Log4j2;

@Log4j2
@RequiredArgsConstructor
@RestController
@RequestMapping("/불라불라")
public class BulaBulaController {
    ...
}

의존성을 추가해주었으니, 이제 로그를 사용할 일만 남았다.

log.info("A서비스 Request \n data1:{} data2:{} data3:{} data4:{}", data1, data2, data3, data4);

log.[로그레벨]("내용"); 의 형식이다.


로그레벨

주로 사용되는 로그 레벨들은 아래와 같다.

ERROR

  • 애플리케이션 실행 중 문제가 발생했음을 나타냅니다. 오류로 인해 일부 기능이 정상적으로 동작하지 않을 수 있습니다.

WARN

  • 경고 메시지로, 잠재적인 문제를 나타냅니다. 심각한 오류는 아니지만 주의를 기울여야 하는 상황입니다.

INFO

  • 애플리케이션의 정상적인 동작을 나타내는 일반적인 정보를 출력합니다. 중요한 이벤트나 상태 변경을 기록할 때 사용됩니다.

DEBUG

  • 애플리케이션의 흐름을 이해하기 위해 상세한 정보를 출력합니다. 주로 개발 및 디버깅 과정에서 유용합니다.

TRACE

  • DEBUG보다 더 세밀한 정보를 출력합니다. 애플리케이션 실행의 각 단계에서 발생하는 모든 것을 추적하는 데 사용됩니다.

내용

log4j2 에서는 파라미터 리터럴을 지원한다. { }을 통해 텍스트에 값이 삽입될 위치를 표시하고, 뒤에 변수를 이어붙여주면 순서대로 채워지게 된다.

log.info("A서비스 Request \n data1:{} data2:{} data3:{} data4:{}", data1, data2, data3, data4);

위의 예시처럼 data1 부터 data4 까지 순서대로 로그에는 { } 위치에 표시될 것이다.


결론

작업하면서 아쉬웠던 부분을 예상한거보다 더 좋게 해결하게 되었다. 하지만, 로그활용의 목적이 아닌 나처럼 디버깅을 위해 사용하는것은 정석은 아님을 말해두고싶다. 나는 미들웨어에 필요할때만 작업을 하고있어서 간단하게 사용하지만, 백엔드 개발자라면 디버깅의 방식을 학습해서 사용하는것을 권장 한다. 그것이 훨씬 효율적이고 시간을 줄여줄 것이다.

Thank You for Visiting My Blog, Have a Good Day 😊
© 2024 JohnnySeo, Powerd By Gatsby. Contact : tjwhd6860@naver.com