본문 바로가기
Spring

Spring framework 로그(log) 알아보기

코동이 2021. 12. 16.

[ 개요 ]

 

  이번에 log4j2 보안 이슈가 터지면서 스프링 로그의 버전을 확인해보았다. 이슈가 터진 버전은 log4j2의 2.0버전 이상이었고 다행인지 불행인지 적용된 로그는 log4j 1.2 버전이었다. 이것도 처음에는 slf4j랑 헷갈려서 1.6.6 버전으로 착각했다. 아무래도 의존성에 slf4j-log4j12 를 보고 그냥 버전이 똑같겠구나 생각한 탓이다. 그만큼 스프링 로그에서 아는 것이 없다고 생각이 들어서 종류와 사용법을 공부했다.

 

[ 목표 ]

 

- 로그 개념

- 로그 종류인 log4j, logback, log4j2의 차이점을 비교한다.
- 각 로그들의 spring boot와 spring legacy 의존성 설정을 알아본다

 

[ 본문 ]

 

로그는 특정 이슈를 분석하기 위해서 사용하는 도구로, 로그 메시지는 3가지 조건이 필요하다.

1. 로그메세지는 애플리케이션이 어떤 역할을 하는지 이해할 수 있는 정보를 제공해야 한다. 
2. 로그메세지는 애플리케이션 퍼포먼스에 영향을 미치지 않도록 효율성이 필요하다.
3. 다른 배포 환경과 상황에도 로그 설정을 적용할 수 있어야 한다.

 

SLF4J를 이용한 로그 작성 방법

 

SLF4J를 사용한 로그 작성은 굉장히 쉽다. 새로운 Logger 객체를 초기화하기 위해 LoggerFactory에 있는 getLogger 메서드를 호출하면 된다. 로그 레벨에 부합하는 메세지를 작성하기 위해 debug, info, warning, error, fatal 메서드를 제공한다.

 

public class MyClass { 
    Logger log = LoggerFactory.getLogger(this.getClass().getName());
 
    public void myMethod() { 
        log.info("This is an info message"); 
        // ... 
    } 
}

 

 

로그 사용을 용이하게 하기 위해, SLF4J는 표준 API 제공한다. SLF4J는 어떠한 프레임워크(logback, log4j, log4j2)든지 각각의 방식으로 구현된다. (개발자가 그 방법을 알 필요는 없다.) SLF4J를 이용하면 코드 변화 없이 로깅 프레임워크를 변경할 수 있다. 단지, SLF4J 인터페이스를 구현하는 다른 프레임워크 의존성으로 교체해주기만 하면 된다.

 

로그 프레임워크가 상호작용이 쉽기 때문에, 로그 종류에 따라 의존성과 설정파일만 바꿔주면 사용방법은 거의 같다.

 

 

Apache Log4j

 

Apache Log4j는 굉장히 오래된 로그 프레임워크이다. 계층 로그 레벨과 로거같은 기본 컨셉을 가지고 있으며, 현대 로깅 프레임워크의 기반이 되었다. 하지만, 2015년 서비스 종료를 알렸기 때문에, 레거시가 아닌 이상 새로운 프로젝트는 다른 프레임워크를 사용해야 한다.

 

Logback

 

Logback은 Log4j와 같은 개발팀이 만들었다. Log4j와 기본 컨셉은 똑같지만, 성능 향상이 되었다. 또한 SLF4J를 기본적으로 지원하며 향상된 필터 옵션이나 로그 설정 자동 새로고침등의 기능도 구현한다. 현재 spring-boot-starter-web의 기본 로깅 프레임워크이다.

 

Apache Log4j2

 

Apache Log4j2는 3가지 로깅 프레임워크 중 가장 최신이다. 목표는 Log4j와 Logback의 문제점을 개선하고 Log4j 성능 향상이다. Lockback과 마찬가지로 Log4j2는 SLF4J를 기본적으로 지원하고, 로깅 설정을 자동 새로고침, 향상된 필터 옵션을 지원을 한다. 게다가 람다식에 기반하여 로그 상태의 lazy evaluation 지원, low-latency를 위한 비동기 로깅제공, GC 작동에 의해 발생하는 지연을 피하기위한 garbage-free mode도 제공한다.

 

 

* 의존성 설정

 

Apache Log4j

 

<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.17</version> 
</dependency>
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
    <scope>test</scope> 
</dependency>

 

log4j는 SLF4J를 지원하지 않는다. 따라서 표준화된 인터페이스를 통해 Log4j를 사욯아기 위해서는 slf4j-log4j12 의존성을 추가해야 한다.

 

 

Logback

 

logback 프레임워크는 logback-core, logback-classic, logback-access 3가지로 구성된다.

 

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.2.3</version>
</dependency>

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-access</artifactId>
    <version>1.2.3</version>
</dependency>

 

logback-core은 로깅 프레임워크의 핵심 기능을 제공한다.
logback-classic은 SLF4J 지원같은 몇가지 특징들을 추가한다.
logback-access는 HTTP 접근 로그를 기록할 수 있도록 여러 컨테이너들을 통합한다.

 

 

Apache Log4j2

 

<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-api</artifactId> 
    <version>2.11.1</version> 
</dependency> 

<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-core</artifactId> 
    <version>2.11.1</version> 
</dependency> 

<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-slf4j-impl</artifactId> 
    <version>2.11.1</version> 
</dependency>

 

log4j-api.jar, log4j-core.jar 2개를 추가한다. 또한 SLF4J API를 사용하고 싶다면, 앞의 2개의 API에 브릿지 역할을 하는 log4-slf4j-impl.jar도 추가해야 한다.

 

 

[ 정리 ]

 

이상으로 로그의 개념을 시작으로 스프링에서 사용하는 3가지 전략을 알아보고 의존성 추가도 확인했다. 아무래도 log4j는 이제 더이상 서비스 종료이므로 logback과 log4j2를 사용하면 된다. 각 로그 프레임워크는 서로 상호교환이 쉬우므로 SFL4J를 꼭 이용하여 의존성을 설정하도록 하면 변경 시 유연하게 대처할 수 있다.

 

 

* 출처

 

https://stackify.com/compare-java-logging-frameworks/

반응형