반응형
해당 글에서는 로깅 라이브러리에 대해 이해를 하고 개발환경을 구성하는 것을 목적으로 작성하였습니다
💡 [참고] yml 파일 형태로 Spring Boot Log4j2를 설정하는 방법이 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
1) 개발 환경
💡 해당 글은 Spring Boot 내에 로깅 라이브러리를 적용한 개발 환경입니다.
개발환경 | 버전 |
java | 1.8 |
Spring Boot | 2.7.4 |
빌드관리도구 | Gradle 7.5 |
개발 툴 | IntelliJ IDEA 2022.3 |
spring-boot-starter-log4j2 | 2.7.4 |
2) 로깅 라이브러리 (Logging Library)
💡 로깅 라이브러리(Logging Library) 란?
- 시스템에서 제공하는 원하는 정보를 기록하여서 일련의 파일에 누적시켜 추후에 확인을 목적으로 사용되는 라이브러리를 의미합니다.
- Spring Boot 내에 내부 라이브러리가 포함하고 있고 외부 라이브러리를 의존성에 추가하여 사용이 가능합니다.
[ 더 알아보기 ]
💡 Spring Boot Logging
- Spring Boot에는 내장으로 ‘jul(java.util.logging)’ 로깅 프레임워크가 내장되어 있어서 이를 즉시 사용할 수 있습니다.
💡 Spring Boot Lombok
- Spring Boot Lombok 내에 Slf4j가 포함되어 있어서 기존의 Logger를 선언해서 사용하는 방식 외에 @Slf4J Annotaion을 이용하여서 간편하게 사용이 가능합니다.
💡 [참고] @Slf4j를 사용하기 전
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jLogginSample {
private static final Logger log = LoggerFactory.getLogger(Slf4jLogginSample.class);
public static void main(String[] args) {
log.info("Slf4jLogginSample");
}
}
💡 [참고] @Slf4j를 사용 후
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Slf4jforLombok {
public static void main(String[] args) {
log.info("Slf4j 테스트");
}
}
1. 로깅 라이브러리 종류
💡 로깅 라이브러리 등장 순서
[등장 순서] jul(java.util.logging) → Log4j → Logback → Log4j2으로 등장하였습니다.
종류 | 설명 |
java.util.logging(jul) | - Java 1.4 버전부터 내장되어 있는 내장 로깅 프레임워크를 의미합니다. |
Slf4j (Simple Logging Facade for Java) |
- Java 애플리케이션을 위한 로깅 API입니다. Logback, Log4j 및 java.util.logging과 같은 다양한 로깅 프레임워크에 대한 간단하고 추상화된 인터페이스를 제공합니다. - SLF4J를 사용하면 코드에서 로그 문장을 작성할 수 있으며 특정 로깅 구현체에 종속되지 않습니다. |
Apache Log4j (Logging for Java) |
- Apache의 Java 기반의 로깅 프레임워크입니다. |
Logback | - Log4j를 만든 개발자가 Log4j 기반으로 더 빠른속도와 더 적은 메모리 점유율등 성능을 개발하여 만든 로깅 프레임워크이다. |
Apache Log4j2 (Logging for Java 2) |
- 다양한 로깅 레벨을 지원하여 디버그, 정보, 경고, 오류 및 기타 로그 메시지의 상세도를 제어할 수 있습니다. 또한 Log4j2는 다양한 로깅 출력 대상을 지원하여 로그를 파일, 콘솔, 데이터베이스 등에 기록할 수 있습니다. |
[ 더 알아보기 ]
💡 퍼사드 패턴(Facade Pattern)
- 퍼사드 패턴은 간략화된 인터페이스를 제공하는 객체입니다. 프레임워크와의 의존성을 낮게 유지하면서 코드를 쉽게 교체할 수 있다는 장점이 있습니다.
💡 Log4j와 Log4j2의 차이점은?
1. 성능
- Log4j2는 Log4j에 비해 향상된 성능을 제공합니다. 이는 내부 아키텍처의 개선과 비동기 로깅 기능의 도입으로 이루어집니다.
2. 구조
- Log4j2는 모듈화된 아키텍처를 가지고 있습니다. 이를 통해 필요한 모듈만 사용하여 애플리케이션의 메모리 사용량을 최적화할 수 있습니다. 또한 Log4j2는 로깅 컨텍스트의 개념을 도입하여 더욱 세밀한 로깅 설정을 가능하게 합니다.
3. 설정
- Log4j는 XML 형식을 사용하여 로깅 설정을 구성하지만, Log4j2는 XML 뿐만 아니라 프로그래밍 방식으로도 설정할 수 있습니다. 이는 Log4j2가 더욱 유연한 로깅 설정을 가능하게 합니다.
4. 통합
- Log4j2는 SLF4J API와 통합되어 사용할 수 있습니다. 이는 SLF4J를 통해 Log4j2를 사용하는 코드와 다른 로깅 프레임워크를 사용하는 코드를 쉽게 전환할 수 있다는 장점을 제공합니다.
2. Spring Boot Access Log
💡 Spring Boot Access Log
- Spring Boot 애플리케이션에서 발생하는 웹 서버(Tomcat, Undertow, Jetty,...)의 '요청'과 '응답'에 대한 로그를 의미합니다. 이를 통해 애플리케이션의 동작 상태를 추적하고 디버깅을 하는데 도움을 줍니다.
- 주요 정보로는 요청된 URL, HTTP 메소드, 응답 상태 코드, 응답 시간 등이 포함됩니다.
💡 [참고] 적용한 application.properties 파일
# Tomcat 접근 Log 지정 - 일자 별 적용
server.tomcat.basedir=.
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%{yyyy-MM-dd HH:mm:ss}t %s %r %{User-Agent}i %{Referer}i %a %b %D
💡 [참고] Access Log와 관련된 참고 사이트
2) Slf4j + Log4j2 라이브러리 적용하기
💡 로깅 프레임워크의 추상체(interface)인 Slf4j를 사용하며 구현체(implements)로 Log4j2를 통하여 로그를 구현합니다.
💡 spring-boot-starter-web 라이브러리 내에는 추상체로 Slf4j와 구현체 'Logback'을 내장하고 있어서 구현체(Logback)를 제외하고 적용합니다.
1. 빌드 관리도구에 라이브러리 종속성 제외
💡 spring-boot-starter-web 내에 기존에 추상체로 지정되어 있는 Logback을 제외합니다. 이는 충돌이 발생할 수 있기에 제외합니다.
configurations {
// 내부 로깅 프레임워크(Logback)을 제외합니다.
all {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
}
2. 빌드 관리도구에 라이브러리 추가
💡 의존성에 spring-boot-starter-log4j2를 추가합니다.
dependencies {
implementation "org.springframework.boot:spring-boot-starter-log4j2"; // Spring Boot Log4j2
}
3. properties 파일 내에 로깅 설정을 합니다.
# logging slf4j
logging:
# default Logging 프레임워크 설정 파일을 참조
config: classpath:log4j2/log4j2-local.xml
4. src/main/resoruce/log4j2/log4j2-local.xml 파일 내에 로그 환경설정을 합니다.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<!-- 파일정보 -->
<Properties>
<Property name="infoLogNm">./logs/test/api_info.log</Property>
<Property name="errorLogNm">./logs/test/api_error.log</Property>
<Property name="authLogNm">./logs/test/api_auth.log</Property>
<Property name="jsonInfoLogNm">./logs/test/api_json_info.log</Property>
<Property name="layoutPattern">%style{%d{UTF-8}}{black} %highlight{%-5level} [%style{%t}{bright,blue}]
%style{%C}{bright,yellow}: %msg%n%throwable
</Property>
</Properties>
<!-- 생성 파일 정보 -->
<Appenders>
<Console name="Console_Appender" target="SYSTEM_OUT">
<PatternLayout pattern="${layoutPattern}"/>
</Console>
<!-- info level -->
<File name="File_Info_Appender">
<fileName>${infoLogNm}</fileName>
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</File>
<!-- error level -->
<File name="File_Error_Appender">
<fileName>${errorLogNm}</fileName>
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</File>
<!-- auth management -->
<File name="File_Auth_Appender">
<fileName>${authLogNm}</fileName>
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</File>
<!-- json api info -->
<File name="File_Json_info_Appender">
<fileName>${jsonInfoLogNm}</fileName>
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</File>
</Appenders>
<!-- 로그 범위 -->
<Loggers>
<!-- Spring 관련 로그 -->
<Logger name="org.springframework" additivity="false" level="INFO">
<AppenderRef ref="Console_Appender"/>
<AppenderRef ref="File_Info_Appender"/>
<AppenderRef ref="File_Error_Appender"/>
</Logger>
<!-- 프로젝트 로그 -->
<logger name="com.pacakge.projectname" additivity="false" level="DEBUG">
<AppenderRef ref="Console_Appender"/>
<AppenderRef ref="File_Info_Appender"/>
<AppenderRef ref="File_Error_Appender"/>
</logger>
<!-- AUTH 관련 로그 -->
<logger name="com.pacakge.projectname.common.filter" additivity="false" level="INFO">
<AppenderRef ref="Console_Appender"/>
<AppenderRef ref="File_Info_Appender"/>
<AppenderRef ref="File_Error_Appender"/>
</logger>
<!-- Default 세팅 -->
<root additivity="false" level="OFF">
<AppenderRef ref="Console_Appender"/>
</root>
</Loggers>
</Configuration>
4) 참고 : 프로젝트 내의 로그가 출력되지 않는 경우
⭐️ 주의 사항 ⭐️
💡 해당 파일에서 중요한 부분은 "com.pacakge.projectname" 해당 부분인데, build.gradle 파일 내에 group 속성에 해당하는 값을 복사하여서 추가하셔야 합니다.
💡 그래야 프로젝트에서 log.info / log.debug와 관련된 로그를 사용하였을 때 프로젝트 내의 콘솔에 찍히는 것을 확인할 수 있습니다.
오늘도 감사합니다. 😀
반응형
'Java > Spring Boot' 카테고리의 다른 글
[Java/Library] Spring Boot Validation 이해하기 : 데이터 유효성 검증 (4) | 2022.11.08 |
---|---|
[Java/Library] Thymeleaf, Thymeleaf Layout 적용하기 (6) | 2022.10.30 |
[Java/Library] HikariCP 이해하고 적용하기 (with. MyBatis) (0) | 2022.10.20 |
[Java/Library] Spring Boot 2.x 환경에서 Swagger 이해하고 적용하기 : SpringDoc openAPI UI (2) | 2022.10.18 |
[Java/Library] Lombok 이해하고 적용하기 -1 : 설정 및 기초 (0) | 2022.10.18 |