[JAVA] Log4j2 - 로깅(Logging) 해보기

bi_sz·2024년 2월 5일
0

Java

목록 보기
8/8
post-thumbnail

개발을 하면서 항상 마주하는 에러..

오류를 해결하기 위해 코드를 분석하던 도중 디버깅을 하려 해도 감이 잡히지 않는 경우를 종종 맞닥뜨리게 되는 것 같다.

Logging 을 통해서 아주 간단하게 원인을 파악하고 해결할 수 있어 살짝 허무했던 경험을 살려 기록을 남깁니다 ..


⭐ 로그 ( Log ) , 로깅 ( 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 의존성 추가

<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 파일을 생성하여 다양한 설정들을 할 수 있습니다.

  • 프로퍼티들을 개별 설정
  • 로그 레벨 설정
  • 파일 최대 용량 설정
  • 에러일 경우의 로그처리는 어떻게 할 것인지
  • root 레벨 설정
  • 로그파일을 저장할 경로 설정

이 외에도 너무 많고 다양한 설정들이 있지만 상세한 코드나 설정 방법에 대해서는 생략하겠습니다.. ㅎㅎ

💫 코드 작성

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 인 경우, tracedebug 이하의 log level 이므로 출력되지 않지만 이미 불필요한 연산이 일어난 경우가 됩니다.

best 방식은 SLF4J 치환문자를 사용하는 방십입니다.

문자열에 중괄호를 넣어 순서대로 출력하고자 하는 데이터들을 , 로 구분한 후 전달하여 치환해주는 방식이므로 불필요한 연산이 발생하지 않습니다.


🌠 정리

코드를 분석하면서 어디서 디버깅을 하고 오류를 수정해야하는지 조차 모를 정도로 정보가 없을 때, 직관적으로 코드에 log 를 찍어보면서 시간을 단축할 수 있었습니다.

오류가 있어 특정한 기능이 작동하지 않지만, 콘솔에 오류가 나타나지 않아 답답했던 상황에서 error log 를 찍어보니 어떤 코드에서, 어떤 오류가 발생하였는지 숨겨져있던 오류가 출력되었습니다.

log level 설정 단계에서 생략되어 보이지 않았던 오류를 출력하여 해결한 경우라고 볼 수도 있겠습니다.

0개의 댓글