REST(Representational State Transfer)는 웹 서비스 디자인 아키텍처 중 하나로, Roy Fielding이 2000년에 그의 박사 학위 논문에서 소개한 개념이다.
Spring은 다양한 로깅 라이브러리와 통합이 잘 되어 있다. 기본적으로 SLF4J를 사용하여 로깅을 처리하며, 일반적으로 Logback이나 Log4j2를 많이 사용한다.
SLF4J(Simple Logging Facade for Java)는 자바에서 다양한 로깅 프레임워크를 사용할 수 있게 하는 추상화 계층이다. SLF4J를 사용하면 특정 로깅 프레임워크에 종속되지 않고, 런타임 시에 사용할 로깅 프레임워크를 선택할 수 있다.
SLF4J 심화
- SLF4J(Simple Logging Facade for Java)는 자바에서 다양한 로깅 프레임워크(Logback, Log4j, Java Util Logging 등)를 사용할 수 있게 하는 일종의 추상화 계층
- SLF4J를 사용하면 특정 로깅 프레임워크에 종속되지 않고, 런타임 시에 사용할 로깅 프레임워크를 선택할 수 있음.
- 로깅 추상화
- SLF4J는 다양한 로깅 프레임워크에 대해 통일된 API를 제공
- 따라서, 애플리케이션 코드에서 SLF4J API만 사용하면 나중에 로깅 프레임워크를 교체하거나 설정을 변경할 때 코드 수정이 필요 없음.
- 경량
- SLF4J 자체는 매우 가볍고, 로깅 프레임워크와의 의존성을 최소화
- 런타임 바인딩
- SLF4J는 런타임에 사용할 로깅 프레임워크를 바인딩할 수 있음. 예를 들어, Logback, Log4j 2 등을 선택할 수 있음.
- SLF4J를 사용하기 위해서는 먼저 SLF4J API를 의존성으로 추가하고, 원하는 로깅 구현체(Logback, Log4j 등)를 바인딩으로 추가해야 함.
implementation 'org.slf4j:slf4j-api:2.0.0' implementation 'ch.qos.logback:logback-classic:1.2.11'
- 로그 메시지 작성 : SLF4J는 다양한 로그 레벨을 제공
- logger.trace("Trace level message");
- logger.debug("Debug level message");
- logger.info("Info level message");
- logger.warn("Warning level message");
- logger.error("Error level message");
- SLF4J는 파라미터를 이용한 로그 메시지 작성도 지원하여 성능과 코드 가독성을 높일 수 있음
int userId = 12345; String status = "active"; [logger.info](http://logger.info/)("User with ID {} has status {}", userId, status);
- SLF4J는 단독으로 로그를 기록하지 않으며, 실제로 로그를 기록하는 것은 Logback, Log4j 2 등
- 이를 위해 SLF4J는 바인딩 라이브러리를 통해 특정 로깅 구현체와 연결됨.
Logback과 바인딩
: logback-classic을 추가하면 SLF4J는 Logback을 사용함.Log4j2와 바인딩
: SLF4J와 Log4j2를 함께 사용하려면 log4j-slf4j-impl 의존성을 추가해야 함.Logback 과 Log4j
- Logback과 Log4j는 둘 다 자바 애플리케이션에서 사용되는 대표적인 로깅 프레임워크
- 프레임워크는 유사한 점이 많지만, 몇 가지 차이점도 존재
- 공통점
- SLF4J 지원: Logback과 Log4j 모두 SLF4J(Simple Logging Facade for Java)를 지원. SLF4J는 로깅 API로, 런타임에 실제 로깅 프레임워크를 선택할 수 있게 해줌.
- 로깅 레벨: 두 프레임워크 모두 동일한 로깅 레벨을 지원(TRACE, DEBUG, INFO, WARN, ERROR, FATAL)
- 구성 파일: XML, JSON, YAML 등 다양한 형식의 설정 파일을 지원. 또한, 환경별로 다양한 설정을 적용할 수 있는 유연성을 제공
- 다양한 Appender: 콘솔, 파일, 네트워크, 데이터베이스 등 다양한 출력 매체를 지원하는 Appender들을 제공
- 필터 및 레이아웃: 로그 메시지를 출력하기 전 다양한 필터링 및 포맷팅을 지원
- 차이점
특징 Logback Log4j 2 성능 - Logback은 기존의 Log4j에 비해 성능 개선이 이루어짐. - Log4j 2는 기존 Log4j 1.x의 성능 문제를 해결 - 메모리 및 속도 측면에서 효율적 - Logback과 유사한 수준으로 성능을 최적화 설정 파일 주로 logback.xml 또는 logback-spring.xml로 설정 주로 log4j2.xml, log4j2.properties, log4j2.yaml 등 다양한 형식의 설정 파일을 지원 재구성 Logback은 설정 파일이 변경되면 자동으로 재로딩을 지원 - Log4j 2도 설정 파일 변경 시 자동으로 재구성을 지원 - 설정 변경 시점에 대한 고급 옵션이 더 다양 비동기 로깅 AsyncAppender를 통해 비동기 로깅을 지원 - Log4j 2는 AsyncLogger를 통해 성능이 더 향상된 비동기 로깅을 지원 - LMAX Disruptor를 사용하여 더 빠르고 낮은 대기 시간의 비동기 로깅을 제공 커뮤니티 및 유지보수 - Logback은 SLF4J의 창시자인 Ceki Gülcü에 의해 개발 - Log4j 2는 Apache 재단에서 관리하며, 대규모 커뮤니티와 활발한 개발 - 꾸준한 업데이트와 유지보수 진행 - Log4j 1.x와의 호환성을 유지하려고 함 프로젝트 복잡도 - Logback은 Spring Boot에서 기본적으로 사용 - Log4j 2는 더욱 다양한 기능을 제공 - 설정이 비교적 간단 - 대규모 프로젝트나 특수 요구사항이 있는 프로젝트에 적합
Logback과 Log4j는 둘 다 자바 애플리케이션에서 사용되는 대표적인 로깅 프레임워크이다. 두 프레임워크는 유사한 점이 많지만, 성능, 설정 방식, 비동기 로깅 지원 등에서 차이가 있다.
로그 설정은 application.properties 파일에서 할 수 있다. 예를 들어:
logging.level.root=INFO
logging.level.com.example=DEBUG
logback-spring.xml 파일을 사용하여 콘솔에 로그를 출력할 수 있다. 예시:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
여기서 appender는 콘솔에 로그를 찍을지 결정한다. class="ch.qos.logback.core.ConsoleAppender"는 콘솔에 로그를 찍겠다는 뜻이다. pattern 태그는 로그의 출력 형식을 지정한다.
로그를 파일로 저장하려면 다음과 같이 설정할 수 있다:
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/spring-boot.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/spring-boot-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
<file>
: 로그 파일의 경로와 이름을 설정<fileNamePattern>
: 로그 파일의 롤링 패턴을 설정<maxFileSize>
: 각 로그 파일의 최대 크기를 설정<maxHistory>
: 보관할 로그 파일의 최대 개수를 설정<pattern>
: 로그 출력 형식을 설정<appender-ref ref="FILE" />
: 설정한 파일 appender를 루트 로거에 적용실제 코드에서 로그를 사용할 때는 다음과 같이 작성한다:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public class MyService {
private static final Logger logger = LoggerFactory.getLogger(MyService.class);
public void performAction() {
logger.info("Action is being performed");
try {
// Some business logic
} catch (Exception e) {
logger.error("An error occurred", e);
}
}
}
AsyncAppender
사용REST의 개념과 원칙들을 다시한번 다질 수 있었다.
또한 스프링 프레임워크의 로깅 관리와 설정 방법에 대해 알게 되어 유익하였다.
특히 SLF4J의 역할과 Logback, Log4j의 차이점을 이해하게 되어 앞으로 프로젝트에서 로깅 웹 로그로 사용자나 서버 데이터를 트래킹하는데 도움이 많이 될 것 같다.
앞으로 실제 프로젝트에 이러한 개념들을 적용해보며 더 깊이 있는 이해를 하고 싶다.