
이번 포스팅에서는 java 어플리케이션에서 로깅을 구현하는 방법을 소개하겠습니다.
1. SLF4J와 Log4j의 차이
SLF4J (Simple Logging Facade for Java)
SLF4J는 Java에서 사용하는 로깅 프레임워크의 인터페이스 역할을 하는 라이브러리입니다. SLF4J는 다양한 로깅
프레임워크 (예: Log4j, Logback, JUL)를 추상화하여, 개발자가 특정 로깅 프레임워크에 종속되지 않고 코드에서 로깅을
사용할 수 있도록 도와줍니다. SLF4J를 사용하면 나중에 로깅 프레임워크를 쉽게 교체할 수 있습니다.
Log4j (Apache Log4j)
Log4j는 Apache에서 개발한 Java 기반의 로깅 라이브러리입니다. Log4j는 설정 파일을 통해 다양한 방식으로 로그를
남길 수 있으며, 다양한 로그 레벨과 출력 옵션을 지원합니다. Log4j는 오랜 기간 사용되어 온 만큼
많은 기능을 제공하지만, 단독으로 사용할 경우 SLF4J와 같은 로깅 프레임워크 변경의 유연성이 떨어집니다.
그래서 요즘은 뭘 쓰는데?
요즘은 SLF4J를 많이 사용하는 추세입니다. SLF4J는 다양한 로깅 프레임워크를 추상화하여 일관된 로깅 API를
제공하므로, 개발자가 특정 로깅 프레임워크에 종속되지 않고 유연하게 로깅을 관리할 수 있게 해줍니다.
또한, 로깅 프레임워크를 변경해야 할 경우 코드 수정 없이 설정만으로 간단하게 교체할 수 있는 장점이 있어
많이 사용됩니다.
2. Gradle 설정
다음은 SLF4J를 사용하는 예제 Gradle 설정입니다:
plugins {
id 'java'
}
group = 'com.frog.project'
version = '1.0.0'
java {
sourceCompatibility = '17'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.slf4j:slf4j-api:2.0.5'
implementation 'ch.qos.logback:logback-classic:1.4.12'
}
이 설정은 SLF4J를 사용하여 로깅을 설정하는 데 필요한 의존성을 포함합니다.
3. 로깅 구현
package org.example;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LoggingExample {
private static final Logger logger = LoggerFactory.getLogger(LoggingExample.class);
public static void main(String[] args) {
logger.info("This is an info message");
logger.debug("This is a debug message");
logger.warn("This is a warning message");
logger.error("This is an error message");
}
}
이 예제에서는 LoggerFactory를 사용하여 Logger 객체를 생성하고,
다양한 로그 레벨 (info, debug, warn, error)에서 메시지를 로깅합니다.
4. Logback 설정
Logback은 SLF4J의 기본 로깅 구현체로, 별도의 설정 파일 (logback.xml)을 통해 로그 파일 경로와 패턴을
설정할 수 있습니다. 다음은 예제 설정입니다
<!-- src/main/resources/logback.xml -->
<configuration>
<!-- 로그 파일 경로 및 패턴 설정 -->
<property name="LOG_PATH" value="./logs/"/>
<property name="LOG_PATH_DEBUG" value="./logs/debug/"/>
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%p] [%t] %c{1.} - %m%n"/>
<!-- 파일로 로그를 출력하는 appender 설정 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/logger.log</file>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/application-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- 파일 상세 로그 설정 -->
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH_DEBUG}/debug.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<!--시간별 롤링-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH_DEBUG}/debug.log.%d{yyyy-MM-dd_HH}.gz</fileNamePattern>
<maxHistory>720</maxHistory>
</rollingPolicy>
</appender>
<!-- 콘솔로 로그를 출력하는 appender 설정 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- root 로거 설정 -->
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
<!-- DEBUG 레벨 로그를 남기는 별도 로거 설정 -->
<logger name="org.example" level="debug" additivity="true">
<appender-ref ref="DEBUG_FILE"/>
</logger>
</configuration>
<property> 태그
- name="LOG_PATH": 일반 로그 파일이 저장될 경로를 지정합니다.
- name="LOG_PATH_DEBUG": 상세 로그 파일이 저장될 경로를 지정합니다.
- name="LOG_PATTERN": 로그 메시지의 형식을 지정합니다
<appender> 태그
- 일반 로그를 파일로 출력하는 FILE appender 설정
- RollingFileAppender를 사용하여 파일에 로그를 기록하고, 날짜에 따라 롤링합니다.
- maxHistory를 30으로 설정하여 최대 30일간의 로그 파일을 유지합니다.
- 상세 로그를 파일로 출력하는 DEBUG_FILE appender 설정
- RollingFileAppender를 사용하여 파일에 로그를 기록하고, 시간에 따라 롤링합니다.
- maxHistory를 720으로 설정하여 최대 720시간(30일) 동안의 로그 파일을 유지합니다.
- 콘솔로 로그를 출력하는 CONSOLE appender 설정
- ConsoleAppender를 사용하여 콘솔에 로그를 출력합니다.
<root> 태그
- level="info": 기본 로그 레벨을 INFO로 설정합니다.
- <appender-ref ref="CONSOLE"/> 및 <appender-ref ref="FILE"/>: CONSOLE과 FILE appender를 사용합니다.
<logger> 태그
- name="org.example": 특정 패키지 (org.example)에 대한 로거를 설정합니다.
- level="debug": 해당 패키지의 로그 레벨을 DEBUG로 설정합니다.
- additivity="false": 상위 로거로 로그를 전파하지 않습니다.
- <appender-ref ref="DEBUG_FILE"/>: DEBUG_FILE appender를 사용하여 상세 로그를 기록합니다.
이 설정을 통해 org.example 패키지의 DEBUG 레벨 이상의 로그는
./logs/debug/ 디렉토리에 시간별로 저장되며, 최대 720개의 파일(30일)까지 보관됩니다.
5. 실행
다음에는 SpringBoot 에서 SLF4J로 로깅을 구현하는 방법과
이걸 이용해 사용자가 API로 보낸 request, response body를 로깅하는 법을 알아봅시다.
'개발 > Java' 카테고리의 다른 글
트랜잭션을 위한 SAGA 패턴 (1) | 2024.11.21 |
---|---|
클린 아키텍처 도입을 위한 SOLID 원칙 복습 (5) | 2024.10.01 |
깨굴딱지의 코드연못입니다
올챙이가 개구리로 거듭나듯, 끊임없는 노력으로 진화하는 개발자의 길을 걷습니다. 🐸