SERVER/Spring Boot

[Spring] 로그 남기기 - Log4j / SLF4J / Logger

GaGah 2021. 8. 24. 00:05

출처 : https://ko.wikipedia.org/wiki/Log4j

Spring Boot 코드를 보면 @SLF4J 어노테이션을 본 적이 있을 것이다. 
Lombok에서 @SLF4J를 써본 사람이라면, 로그 관련된 어노테이션이라는 것을 알 수 있을 것이다.
그렇다면 SLF4J는 무엇이고 Log4j, Logger은 무엇일까?

 

 

👍🏻 로그의 중요성

프로그램에서 로그를 작성해두면, 어떤 동작을 하고 있는지 혹은 어느 부분에서 에러가 났는지 쉽게 파악할 수 있다.

특히나 오류가 발생했을 때, 어떤 함수 호출에서 문제가 있었는지/에러 메세지가 무엇인지, 어떤 값이 들어갔는지 등을 알 수 있기 때문이다. 

단, System.out.prinln()을 사용하여 로그를 찍지 말자.
운영할 때는 전혀 사용되지 않고, 성능에 문제가 발생한다. 

 

1️⃣ SLF4J 란?

SLF4J는 Simple Logging Facade for Java의 약자로, 로깅 추상화 라이브러리이다. 

즉, 로깅하는 일을 직접하지 않고 로깅 구현체를 찾아서 실제 로깅 라이브러리(구현체)를 찾아서 사용할 수 있게한다. 

 

SLF4J 말고도 또 다른 로깅 추상화 라이브러리로 JCL이 있고 스프링부트에서 사용하고 있다. 

하지만, JCL은 클래스 로더의 문제 등으로 인해 많이 사용하지 않는다. 

 

SLF4J는 컴파일 시점에 들어있는 의존성 정보로 판단하여 클래스 로더나 메모리 문제가 없어 많이 사용하는 추세이다. 

또한, SLF4J는 Parameterized Logging이라고 불리는 Advanced Feature를 제공한다. 그리고 Parameterized Logging은 로깅 성능을 크게 향상시킨다. 

 

 

 Parameterized Logging 사용 예시

Logger logger = LoggerFactory.getLogger(PlaceHolders.class);
Integer age = 23; //Logging the information

logger.info("At the age of {} ramu got his first job", age);

 

SLF4J의 3가지 모듈

1) API

인터페이스로서 이것 혼자 사용할 수 없다. 

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
</dependency>

 

2) Binding

API 구현체와 이어주는 어댑터 역할이다. 

여러 바인딩 중 반드시 하나만 사용해야 한다. 

 

 

3) Bridge

레거시를 위해 필요한 모듈이다. 

 

 

로그레벨 

① FATAL : 매우 심각한 에러가 냈을 때. 

② ERROR : 의도하지 않은 에러가 발생했을 때. 

③ WARN : 에러는 아니지만 잠재적 가능성이 있는 경우.

④ INFO : 요구사항에 따라 시스템 동작을 보여줄 때

⑤ DEBUG : Info 레벨보다 상세히 나타낼 때 사용. (개발환경에서 많이 사용)

 

 

 

2️⃣ Log4j2란?

자바로 개발된 로깅 라이브러리이며 Log4j2는 Log4j 에서 몇가지 문제점을 개선하여 나온 업그레이드 버전

(요즘은 보통 Log4j2를 사용한다고 한다.) 

 

Log4j는 3가지 컴포넌트로 구성

1. Logger : 프로그램으로부터 로깅정보를 받는다. (데이터를 기록하는 역할)

2. Appender : 로깅정보를 여러가지 장치로 내보낸다. (어디에 기록할지 - ex, 파일, 콘솔, jdbc, smtp 등)

3. Layout : 로깅 정보를 포멧팅한다. (어떤 스타일로 기록할지 정하는 역할)

 

 

로그레벨 

① FATAL : 매우 심각한 에러가 냈을 때. 

② ERROR : 의도하지 않은 에러가 발생했을 때. 

③ WARN : 에러는 아니지만 잠재적 가능성이 있는 경우.

④ INFO : 요구사항에 따라 시스템 동작을 보여줄 때

⑤ DEBUG : Info 레벨보다 상세히 나타낼 때 사용. (개발환경에서 많이 사용)

 

장점

1. thread safe 하다.

2. 여러 종류의 Appender 지원한다.

3. 명확한 기준 레벨을 가지고 있다. 

 

 

3️⃣ java.util.logging

자바가 기본으로 제공하는 로깅 유틸리티이며 이를 사용하면 외부 라이브러리를 사용할 필요가 없다. 

하지만, 외부 라이브러리(Log4j)보다 속도가 느리고 기능도 부족하여 많이 사용하지 않는다.

 

 

 

📘 참고자료 

- https://ko.wikipedia.org/wiki/Log4j

- https://logging.apache.org/log4j/2.x/

- https://yangbongsoo.gitbook.io/study/undefined/log

 

 

Parameterized Log

- https://www.tutorialspoint.com/slf4j/slf4j_parameterized_logging.htm

 

 

Slf4j를 사용하기 전 사용설명서를 읽어보자

- http://www.slf4j.org/manual.html

http://www.slf4j.org/

 

 

읽어보기

https://engkimbs.tistory.com/861

 

 

의존성 추가하는 gradle/maven 

https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12

 

 

 

LIST