<개발환경>
💻 Apple M1 Pro (macos14.5 on arm64)
🛠️ IDE: IntelliJ
🏁 Language: JAVA17
🔗 Framework: Springboot 3.3.0
⚙️ Project: Gradle
🗄️ Database: MySQL 8.3.0 Homebrew
왜 로그 설정을 해야되는 걸까요?
쉽게 print문으로 확인하고 싶어요!
로그 설정을 굳이 하지 않아도 '개발'을 할 수는 있을 겁니다.
그러나 문제 발생 시 원인을 찾기 위해 로그는 매우 중요합니다.
로그대신 print문으로 디버깅 하시는 분들도 더럿 계시겠지요.
간단하게 한두개 확인할 때는 print문을 사용할 수 있겠지만 코드 한두줄 짜는게 아니라면 print문보다 log를 사용하는 것이 효율적이며 필수적입니다.
- 로깅 레벨 설정: 로그는 정보, 경고, 오류 등 다양한 레벨로 관리되어 중요도에 따라 필터링할 수 있습니다.
- 파일 및 콘솔 출력: 로그는 파일로 저장되거나 콘솔에 출력될 수 있어 문제 발생 시 기록을 쉽게 조회할 수 있습니다.
- 구조화된 데이터: 로그는 타임스탬프, 스레드 정보 등과 함께 출력되어 디버깅을 더 효과적으로 할 수 있습니다.
- 비동기 처리: 로그 프레임워크는 비동기 로깅을 지원하여 애플리케이션 성능에 미치는 영향을 최소화합니다.
- 유지보수: 로그는 시스템의 상태를 지속적으로 모니터링하고 유지보수할 수 있도록 도와줍니다.
SLF4J (Simple Logging Facade for Java)
SLF4J는 이름에서 의미하는 바와 같이 Spring Boot에서 가장 기본적으로 사용되는 로깅 추상화 계층입니다.
Lombok의 @Slf4j 어노테이션을 사용하면 별도의 로거 선언 없이 SLF4J 로거를 사용할 수 있습니다.
*Lombok 이란?
Java 코드에서 반복적인 작업을 줄이기 위해 사용되는 라이브러리
아래에서 설명할 JDK logging, Logback, Log4j2 등의 다양한 로깅 프레임워크를 위한 추상화 계층을 제공하여,
로깅 프레임워크를 변경할 때 코드 자체를 수정할 필요 없이 설정만 변경하면 됩니다.
JDK logging vs Logback vs Log4j2 비교
특징 | JDK Logging | Logback | Log4j2 |
설정 방식 | 프로그래밍 또는 properties 파일 |
XML 또는 Groovy 설정 |
XML, JSON, YAML , properties 파일 |
성능 | 보통 | 높음 | 매우 높음 |
유연성 | 제한적 | 높음 | 매우 높음 |
SLF4J 통합 | 아니오 | 예 | 예 |
XML 설정 지원 | 예 | 예 | 예 |
JSON 설정 지원 | 아니오 | 아니오 | 예 |
로그 회전 | 제한적 | 고급 | 고급 |
비동기 로깅 | 아니오 | 예 | 예 |
커뮤니티 지원 | 보통 | 높음 | 매우 높음 |
사용 용이성 | 간단 | 보통 | 보통 |
의존성 관리 | 외부 의존성 없음 | 추가 의존성 필요 | 추가 의존성 필요 |
로그 설정하기 (콘솔에 mybatis 쿼리 출력)
@Slf4j 어노테이션을 통한 Logback 프레임워크 사용
1. Lombok 의존성 추가
pom.xml
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</dependency>
build.gradle
dependencies {
// Lombok dependency
implementation 'org.projectlombok:lombok:1.18.26'
annotationProcessor 'org.projectlombok:lombok:1.18.26'
// Other dependencies...
}
+ 1-2. IDE 설정 (IntelliJ)
2. @Slf4j 어노테이션 사용 - 예시
이제 Lombok의 @Slf4j 어노테이션을 사용하여 로그를 사용할 수 있습니다.
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@Slf4j
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
log.info("Application started successfully!");
}
}
위 코드에서 @Slf4j 어노테이션을 사용하면 Lombok이 자동으로 Logger 인스턴스를 생성해주므로, log 객체를 통해 로그를 출력할 수 있습니다.
3. 로그 설정 (Logback) - mybatis sql 출력
Spring Boot 3.3.0의 기본 로깅 프레임워크는 Logback입니다.
Logback 설정 파일(src/main/resources/logback-spring.xml)을 사용하여 로그 출력을 설정할 수 있습니다.
이 설정 파일을 통해 콘솔에 로그를 출력하도록 설정할 수 있습니다. logger 태그를 사용하여 특정 패키지 또는 클래스에 대한 로그 레벨을 설정할 수 있습니다.
src/main/resources/logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 콘솔에 로그를 출력하는 설정 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- MyBatis SQL 로그 설정 -->
<logger name="org.mybatis" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
<logger name="org.apache.ibatis.logging" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE" />
</logger>
<!-- 전체 로그 설정 -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
*logback-spring.xml 파일명으로 src/main/resources 디렉토리에 있으면 SpringBoot가 이를 자동으로 로드하고 적용합니다.
파일명을 변경하거나 다른 위치에 파일이 있다면, SpringBoot가 해당 파일을 찾을 수 있도록 명시적으로 설정해 주어야 합니다.
저는 위와 같은 구조로 logback-spring.xml을 위치했기 때문에 application.yml에 해당 위치를 알려주는 코드를 추가해주었습니다.
application.yml
logging:
config: classpath:config/logback-spring.xml
resources/mybatis/mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "HTTP://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="false" />
<setting name="useGeneratedKeys" value="true" />
<setting name="defaultExecutorType" value="REUSE" />
<setting name="jdbcTypeForNull" value="NULL" />
<setting name="logImpl" value="org.apache.ibatis.logging.stdout.StdOutImpl"/>
</settings>
</configuration>
10번째 라인을 추가해주시면 됩니다.
MyBatis 설정에서 로그 구현체를 지정하는 역할을 합니다. 이 설정은 MyBatis가 SQL 쿼리와 기타 로그 메시지를 출력하는 방법을 결정합니다.
- org.apache.ibatis.logging.log4j.Log4jImpl: Log4j를 사용하여 로그를 출력합니다.
- org.apache.ibatis.logging.slf4j.Slf4jImpl: SLF4J를 사용하여 로그를 출력합니다. SLF4J는 다양한 로깅 프레임워크 (Logback, Log4j 등)를 위한 추상화 계층입니다.
- org.apache.ibatis.logging.jdk14.Jdk14LoggingImpl: java.util.logging (JUL)를 사용하여 로그를 출력합니다.
- org.apache.ibatis.logging.nologging.NoLoggingImpl: 로그를 비활성화합니다.
위와 같이 API를 호출하면 sql쿼리가 출력되는 것을 확인할 수 있습니다!
chore: Configure MyBatis logging · a-taeyeon/springboot-tistory-example@512e08f
a-taeyeon committed Jun 3, 2024
github.com