개발을 하면서 항상 마주하는 에러..
오류를 해결하기 위해 코드를 분석하던 도중 디버깅을 하려 해도 감이 잡히지 않는 경우를 종종 맞닥뜨리게 되는 것 같다.
Logging 을 통해서 아주 간단하게 원인을 파악하고 해결할 수 있어 살짝 허무했던 경험을 살려 기록을 남깁니다 ..
Log 란 시스템 동작 시 시스템 상태
, 작동 정도
를 시간의 경과에 따라서 기록한 것입니다.
Logging 이란 정보를 제공하는 일련의 기록인 Log를 생성하는 과정입니다.
Logging 의 장점
- 개발 프로그램의 디버깅
- 예기치 못한 문제의 원인 파악
- 시스템 및 사용자의 동작 패턴 분석
- 해커(침입)의 비정상 동작의 기록 감지
- 분석을 통한 통계화
Logback
, Log4J
, Log4J2
등의 로그 관련 작업을 할 수 있는 라이브러리들이 있습니다.
Spring Boot 에서는 위의 라이브러리들을 통합하여 인터페이스로 제공하는 SLF4J
라이브러리도 제공합니다.
SLF4J
를 사용하게 된다면 다른 로깅 프레임워크로 전환하더라도 소스 코드 자체의 변경을 막을 수 있습니다.
log level 은 아래와 같다
trace
< debug
< info
< warn
< error
error
가 가장 심각한 로그 레벨이다.
일반적으로 개발서버는 debug
, 운영서버는 info
로 설정하며 설정된 level 이하의 상태는 출력되지 않는다.
현재 작업하고있는 프로젝트에서 Log4J2
를 사용하고있어 해당 예시를 통해 정리하였습니다.
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
</dependency>
maven 프로젝트에서 pom.xml 파일에 dependency 를 추가해주었습니다.
dependencies {
implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'
}
gradle 프로젝트의 경우 build.gradle 에서 dependency 를 추가해주었습니다.
https://mvnrepository.com/
레포지토리 저장소에서 쉽게 원하는 라이브러리와 버전에 맞는 dependency 를 찾아볼 수 있습니다.
resources 폴더 안에 properties 파일을 생성하여 다양한 설정들을 할 수 있습니다.
이 외에도 너무 많고 다양한 설정들이 있지만 상세한 코드나 설정 방법에 대해서는 생략하겠습니다.. ㅎㅎ
import org.apache.logging.log4j.Logger;
import lombok.extern.log4j.Log4j2;
사용할 라이브러리들을 import 해줍니다.
Spring Boot 프로젝트에서 Service 클래스에서 사용해주었습니다.
@Log4j2
를 통해 사용을 선언해주었습니다.
log.debug("sendSatusUpdate service");
log.info("batchStatusUpdate err : {}", err);
log.error("error: {}", mapping);
코드에서 자유롭게 용도게 맞게 사용해줄 수 있습니다.
// worst
log.trace("trace log=" + error);
// best
log.trace("trace log={}", error);
worst 의 방식으로 trace 를 출력한다면 로그 출력 자체에는 문제가 없지만
자바 문법상 "trace log = " + error
이라는 문자열 더하기 연선이 먼저 일어난 후 log level 을 확인하게됩니다.
해당 프로젝트의 log level 설정이 debug
인 경우, trace
는 debug
이하의 log level 이므로 출력되지 않지만 이미 불필요한 연산이 일어난 경우가 됩니다.
best 방식은 SLF4J 치환문자를 사용하는 방십입니다.
문자열에 중괄호를 넣어 순서대로 출력하고자 하는 데이터들을 ,
로 구분한 후 전달하여 치환해주는 방식이므로 불필요한 연산이 발생하지 않습니다.
코드를 분석하면서 어디서 디버깅을 하고 오류를 수정해야하는지 조차 모를 정도로 정보가 없을 때, 직관적으로 코드에 log 를 찍어보면서 시간을 단축할 수 있었습니다.
오류가 있어 특정한 기능이 작동하지 않지만, 콘솔에 오류가 나타나지 않아 답답했던 상황에서 error log 를 찍어보니 어떤 코드에서, 어떤 오류가 발생하였는지 숨겨져있던 오류가 출력되었습니다.
log level 설정 단계에서 생략되어 보이지 않았던 오류를 출력하여 해결한 경우라고 볼 수도 있겠습니다.