본문 바로가기
개발자 일지/Java

[Java] Logback, SLF4J 기초, 사용 이유, 환경 설정 및 테스트

by 네빌링 2024. 10. 4.
반응형

Java 개발시 로그 남길 때 많이 사용하는 Logback, SLF4J에 대해 알아보려고합니다.

그리고 환경 설정 및 테스트 예제를 같이 포스팅해보겠습니다.

 

Logback-SLF4J-썸네일

 

[목차]

  1. Logback, SLF4J란?
  2. Logback을 많이 사용하는 이유
  3. Logback 환경 설정 및 테스트

1. Logback, SLF4J란?

 

Logback은 자바 기반 로깅 프레임워크입니다.

자바, 스프링 개발시 로그를 찍을 때 가장 많이 사용하는 프레임워크가 아닐까 싶습니다.

 

Logback은 SLF4J(Simple Logging Facade for Java)를 구현한 구현체입니다.

SLF4J는 로깅 프레임워크에 대한 추상화를 제공해 로깅 구현을 돕습니다. 

이전에 Log4j가 많이 쓰였는데 지금은 Logback을 많이 사용하는 추세입니다.

 

2. Logback을 많이 사용하는 이유

 

Logback은 앞서 얘기했듯이 Log4j보다 많이 쓰입니다. 

성능적으로 Log4j보다 뛰어나고 구성시 XML을 활용해 간단하게 환경 설정을 할 수 있습니다.

또한 다양한 출력 형식(json, xml, text 등)을 지원합니다.

그리고 SLF4J가 자바 로깅 추상화의 기본이 되었기 때문에 이를 가장 잘 구현한 것이 Logback입니다. 

 

3. Logback 환경 설정 및 테스트

 

사실 스프링부트를 사용하면 의존성이 자동으로 추가됩니다.

스프링부트 의존성 중 spring-boot-starter가 그 역할을 합니다.

 

그러나 일반적인 스프링 프레임워크를 쓴다면 의존성을 다음과 같이 추가해주면 됩니다.

 

maven기준 pom.xml에 추가:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.3.0</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.30</version>
</dependency>

 

이후 resources 하위에 logback-spring.xml이라는 이름으로 파일을 추가해준 후 아래와 같이 구성해줄 수 있습니다.

 

logback-spring.xml에 설정 추가:

<configuration>
	<!-- CONSOLE이란 이름으로 로그 표현/표기 방식 설정 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
        </encoder>
    </appender>

	<!-- root는 특별한 설정을 제외하고 모든 곳에 적용된다. level INFO 상위만 로깅한다. -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

 

이제 아래와 같이 테스트해볼 수 있습니다.

 

LoggingController.java 만들어서 테스트:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

//@slf4j //해당 어노테이션 사용하면 아래 LoggerFactory 로직 안 사용해도 됨
@RestController
public class LoggingController {
    private static final Logger logger = LoggerFactory.getLogger(LoggingController.class); // 클래스 이름 일관성 유지

    @GetMapping("test")
    public String loggingTest() {
        // 설정상 root에 INFO로 설정하였으니 아래 로깅은 error, warn, info만 찍힌다.
        logger.error("Error log: An error has occurred!"); // 찍힘
        logger.warn("Warn log: This is a warning message!"); // 찍힘
        logger.info("Info log: Logging test started!"); // 찍힘
        logger.debug("Debug log: This debug message will not be printed."); // 안 찍힘
        logger.trace("Trace log: This trace message will not be printed."); // 안 찍힘

        return "Logging test completed."; // HTTP 응답 반환
    }
}
반응형