Java/Spring Boot
[Java] Spring Boot Log4j2 이해하기 -1 : 주요 특징, 구성 요소, yml 설정방법
adjh54
2024. 1. 14. 00:47
반응형
해당 글에서는 Log4j2에 대해 이해하고 Spring Boot 환경에서 Log4j2를 설정하는 방법에 대해 알아봅니다.
💡 [참고] xml 형태로 간단한 설정을 하는 방법에 대해 알고 싶으시면 이전에 작성한 글을 참고하시면 도움이 됩니다.
1) Log4j2
💡 Apache Log4j2 (Logging for Java)
- Apache Software Foundation에서 개발한 Java 기반의 로깅 유틸리티이며 Log4J의 업그레이드 버전입니다.
- Log4j에 비해 로깅 기능을 더욱 향상시킨 것으로 향상된 멀티스레드 환경에서의 성능, 로그 메시지의 더 나은 파라미터화, 로그 이벤트에 대한 더 많은 메타데이터 제공 등을 통해 로깅의 유연성과 확장성을 증가시켰습니다.
- Log4j2는 Java 7이상에서만 동작하며 Log4J 1.x, SLF4J, Commons Logging 및 java.util.logging과의 호환성을 유지하면서도 더욱 향상된 로깅 기능을 제공합니다.
[ 더 알아보기 ]
💡 로깅(Logging)이란
- 소프트웨어 개발 및 유지보수 과정에서 중요한 역할을 하는데, 이는 오류 디버깅, 시스템 동작 확인, 보안 이슈 추적 등 다양한 목적으로 사용됩니다.
💡 Log4j와 Log4j2의 차이점은 무엇일까?
- Log4j에 비해 Log4j2는 멀티스레드 환경에서의 성능 향상, 로깅 구성 변경 시 애플리케이션 재시작 없이 동적 로딩, API 개선 등을 제공합니다.
2) Log4j2 주요 특징
1. 비동기 로거 지원
💡 비동기 로거 지원
- Log4j2 로깅 프레임워크의 비동기 로깅 기능을 제공합니다. 이를 사용하면 로그 이벤트를 즉시 처리하지 않고 백그라운드에서 처리하여 응용 프로그램의 성능을 향상합니다.
- 또한 로깅 작업이 애플리케이션의 성능에 미치는 영향을 최소화할 수 있습니다. 또한 다양한 애플리케이션에서 확장성과 성능을 향상하는 데 도움이 됩니다.
- 단, 메인 애플리케이션 스레드와 별도의 스레드에서 처리되므로 로그 이벤트가 실제로 로그 파일에 기록되기까지 시간이 걸릴 수 있습니다. 또한, 로그 이벤트 버퍼링과 관련된 설정을 적절히 조정해야 합니다.
💡 [참고] 비동기 로깅 - 최대 처리량 비교
- 해당 그래프에서는 동기 로거, 비동기 어펜더, 비동기 로거의 처리량을 비교합니다. 이는 모든 스레드 별 총처리량입니다.
- 64개 스레드를 사용한 테스트에서 비동기 로거는 비동기 어펜더보다 12배 빠르고 동기 로거보다 68배 빠릅니다.
- 비동기 로거의 처리량은 스레드 수에 따라 증가하는 반면, 동기 로거와 비동기 어펜더는 모두 로깅을 수행하는 스레드 수에 관계없이 다소 일정한 처리량을 갖습니다.
2. 다양한 형식의 로깅 설정 지원
💡 다양한 형식의 로깅 설정 지원
- Log4j2는 다양한 애플리케이션과 환경에 맞게 로깅을 구성할 수 있도록 지원합니다. XML, JSON, YAML, Properties 등 다양한 형식으로 로깅 설정을 할 수 있습니다.
형식 | 설명 |
XML | XML 형태로 로깅 환경 설정파일을 구성할 수 있습니다 |
JSON | JSON 형태로 로깅 환경 설정파일을 구성할 수 있습니다 |
YAML | YAML 형태로 로깅 환경 설정파일을 구성할 수 있습니다 |
Properties | Properties 형태로 로깅 환경 설정파일을 구성할 수 있습니다 |
3. 다양한 Appender 지원
💡 다양한 Appender 지원
- Appender는 로그 메시지의 기록방식을 정의합니다.
- 아래와 같이 콘솔, 파일, 데이터베이스, JMS, NoSQL 등 다양한 출력 대상(Appender)을 지원합니다.
4. 필터링 지원
💡 필터링 지원
- 로그 이벤트를 필터링하는 데 사용되는 다양한 필터들을 제공합니다.
- 필터는 로그 이벤트가 로그 설정에 지정된 기준을 충족하는지 여부를 결정하는 역할을 합니다
필터 이름 | 설명 |
BurstFilter | 로그 이벤트를 순간적으로 제한하는데 사용됩니다. |
CompositeFilter | 여러 필터를 결합하여 사용하며, 필터들은 지정된 순서대로 실행됩니다. |
DynamicThresholdFilter | 로그 이벤트의 심각도에 따라 동적으로 임계값을 조정합니다. |
MapFilter | 특정 맵핑 값에 따라 로그 메시지를 필터링합니다. |
MarkerFilter | 로그 이벤트에 지정된 마커가 포함되어 있는지 여부에 따라 필터링합니다. |
RegexFilter | 로그 이벤트를 정규 표현식을 사용하여 필터링합니다. |
Script | 사용자 정의 스크립트를 이용하여 로그 이벤트를 필터링합니다. |
ThresholdFilter | 로그 이벤트의 심각도가 특정 임계값보다 높거나 낮은 경우 필터링합니다. |
TimeFilter | 로그 이벤트가 특정 시간 범위에 속하는지 여부에 따라 필터링합니다. |
5. 플러그인 아키텍처
💡 플러그인 아키텍처
- Log4j2는 사용자 정의 플러그인을 쉽게 개발하고 배포할 수 있는 플러그인 아키텍쳐를 제공합니다.
3) Log4j2 구성요소
💡 Log4j2 구성요소
- Log4j2 설정에 사용하는 구성 요소에 대해 상세히 알아봅니다.
- 해당 글은 Log4j2를 yaml 형태로 구성하는 방법을 기준으로 작성하였습니다.
Log4j2 구성요소 요약
💡 요약
- 모든 요소를 다룰 수 없기에 자주 사용되는 요소들에 대해서만 확인해 봅니다.
1차 분류 | 2차 분류 | 3차 분류 | 설명 |
Configutation | 로그 설정의 최상위 항목 | ||
Configutation | Properties | 로그 설정의 속성을 정의하는 항목 | |
Configutation | Properties | Property | 개별 속성을 정의하는 항목 |
Configutation | Appenders | 어플리케이션에서 사용할 로그 출력 방법을 정의하는 항목 | |
Configutation | Appenders | Console | 콘솔에 로그를 출력하는 방법을 정의하는 항목 |
Configutation | Appenders | File | 파일에 로그를 출력하는 방법을 정의하는 항목 |
Configutation | Appenders | RollingFile | 파일을 롤링하는 방식으로 로그를 출력하는 방법을 정의하는 항목 |
Configutation | Loggers | 로거를 설정하는 항목 | |
Configutation | Loggers | Logger | 일반적인 로거를 정의하는 항목 |
Configutation | Loggers | root | 루트 로거를 정의하는 항목 |
1. Configuration
💡 Configuration
- 로깅 구성의 기초를 형성하는 데 사용하며 컴포넌트들이 어떻게 함께 동작을 하는지에 대해 정의하며 ‘로깅 동작의 전반적인 관리’를 담당합니다.
- 로깅 파일을 구성하는 형태로는 XML, JSON, YAML, properties 파일 또는 프로그램 코드로 작성할 수 있습니다..
- 로깅 요청이 어떤 Appender로 라우팅 되어야 하는지 어떤 로그 메시지가 필터링되어야 하는지 등을 결정합니다. 이는 프로그램의 로깅 동작을 세밀하게 제어할 수 있게 해 줍니다
1차 분류 | 속성 | 설명 |
Configutation | name | 구성 파일의 이름을 정의합니다. |
Configutation | status | 구성 파일의 상태(로그레벨)을 지정합니다. 해당 값으로는 "off", "trace", "debug", "info", "warn", "error", "fatal", "all"를 가집니다. |
2. Properties
💡 Properties
- Log4j2 구성에서 사용할 수 있는 ‘변수를 정의’하는 데 사용됩니다.
- 이 속성을 통해 로그 파일의 이름이나 경로와 같은 값을 중앙에서 관리하도록 할 때 유용합니다.
1차 분류 | 2차 분류 | 3차 분류 | 속성 | 설명 |
Configutation | 설정 관련 환경을 정의하는 최상위 태그입니다. | |||
Configutation | Properties | 설정에 사용되는 속성들을 정의하는 태그입니다. | ||
Configutation | Properties | Property | 속성의 변수로 이름과 값을 정의하는 태그입니다. | |
Configutation | Properties | Property | name | 속성으로 사용될 변수명을 정의하는 태그입니다. |
Configutation | Properties | Property | value | 속성으로 사용될 변수명에 대한 값을 정의하는 태그입니다. |
💡 사용예시
- 아래와 같은 형태로 Configutation > Properties 형태로 구성되어 있으며 하위 속성으로 Property 내에서는 ‘경로’ 혹은 ‘변수’를 지정하기 위해 사용됩니다.
- 이를 통해 중앙에서 관리되며 다른 속성에서 해당 값을 ${name} 값으로 호출하여 사용이 가능합니다.
Configutation:
# 구성 이름
name: multiflex-api-local
# [Properties] 설정에 사용되는 속성들을 정의
Properties:
Property:
- name: "log-path"
value: "./logs"
- name: "charset-UTF-8"
value: "UTF-8"
- name: "layout-pattern"
value: "%style{%d{UTF-8}}{black} %highlight{%-5level} [%style{%t}{bright,blue}] %style{%C}{bright,yellow}: %msg%n%throwable"
- name: "info-log"
value: ${log-path}/multiflexApi/api-info.log
- name: "error-log"
value: ${log-path}/multiflexApi/api-error.log
- name: "auth-log"
value: ${log-path}/multiflexApi/api-auth.log
- name: "json-log"
value: ${log-path}/multiflexApi/api-json-info.log
3. Appenders
💡 Appenders
- 로깅 라이브러리에서 로그 메시지의 기록 방식을 정의하는 데 사용됩니다.
- Appender 하위에는 로그 메시지를 다른 출력 대상에 쓰는 방법(Console, File, RollingFile)을 정의합니다.
1차 분류 | 2차 분류 | 3차 분류 | 설명 |
Configuration | Appenders | 로그 메시지의 기록방식을 정의 | |
Configuration | Appenders | Console | 콘솔에 로그 메시지를 작성하는 방식 |
Configuration | Appenders | File | 파일에 로그 메시지를 작성하는 방식 |
Configuration | Appenders | RollingFile | 파일에 로그 메시지를 쓰되 파일 크기가 특정 크기에 도달하면 새 파일에 작성하는 방식 |
💡 사용예시
1. Appenders - Console
- 콘솔에 로그 메시지를 작성하는 방식을 정의합니다.
- 이 요소의 이름은 'console-appender'이고 로그 메시지는 시스템 출력(SYSTEM_OUT)에 기록됩니다.
- PatternLayout 요소는 로그 메시지의 형식을 정의하며, 이 경우 'layout-pattern' 속성을 참조하여 형식화합니다.
2. Appenders - File
- 로그를 파일에 기록하는 방식을 정의합니다.
- 각각의 파일 Appender는 서로 다른 파일(info-log, error-log, auth-log, json-log)에 로그를 기록합니다.
- 각 파일 Appender는 로그 메시지의 형식을 정의하는 PatternLayout을 가지고 있습니다.
3. Appenders - RollingFile
- 로그를 파일들을 압축파일로 출력하는 방식을 정의합니다.
- 로그 메시지는 'rolling-file-log.log'라는 파일에 기록되며, 파일 크기가 200KB에 도달하거나 매일 1회씩 새 파일로 롤링됩니다.
- 롤링 로그 파일은 'log-path' 디렉터리의 'archive' 하위 디렉터리에 저장되며, 저장되는 파일의 이름은 'rollingFile.log.'에 날짜 및 시간 정보가 추가된 형식입니다.
- 롤링된 로그 파일은 최대 30개까지 유지되며, 그 이상의 파일은 삭제됩니다.
Configutation:
# [Appenders] 로그 기록방식 정의
Appenders:
# [Appenders - Console] 콘솔에 로그 메시지를 작성하는 방식 정의
Console:
- name: console-appender
target: SYSTEM_OUT
PatternLayout:
pattern: ${layout-pattern}
# [Appenders - File] 로그를 파일로 기록하는 방식 정의
File:
- name: file-info-appender
fileName: ${info-log}
PatternLayout:
pattern: "%d %p %C{1.} [%t] %m%n"
- name: file-error-appender
fileName: ${error-log}
PatternLayout:
pattern: "%d %p %C{1.} [%t] %m%n"
- name: file-auth-appender
fileName: ${auth-log}
PatternLayout:
pattern: "%d %p %C{1.} [%t] %m%n"
- name: file-json-info-appender
fileName: ${json-log}
PatternLayout:
pattern: "%d %p %C{1.} [%t] %m%n"
# [Appenders - RollingFile] 로그를 파일들을 압축파일로 출력하는 방식 정의
RollingFile:
name: rolling-file-appender
fileName: ${log-path}/rolling-file-log.log
filePattern: "${log-path}/archive/rollingFile.log.%d{yyyy-MM-dd-hh-mm}_%i.gz"
PatternLayout:
charset: ${charset-UTF-8}
pattern: ${layout-pattern}
Policies:
SizeBasedTriggeringPolicy:
size: "200KB"
TimeBasedTriggeringPolicy:
interval: "1"
DefaultRollOverStrategy:
max: "30"
fileIndex: "max"
4. Logger
💡 Logger
- 로그 메시지가 어떤 수준에서 기록될 것인지 결정합니다. 이 속성의 값은 특정 수준에 대한 로그 메시지의 처리 방법을 정의하는 Logger 인스턴스입니다.
- 예를 들어, DEBUG, INFO, WARN, ERROR 등 다양한 로그 수준을 설정할 수 있습니다. 특정 수준을 설정하면 그 수준과 그 이상의 중요도를 가진 메시지만 기록됩니다.
1차 분류 | 2차 분류 | 3차 분류 | 설명 |
Configutation | Loggers | 로거를 설정하는 항목 | |
Configutation | Loggers | Logger | 일반적인 로거를 정의하는 항목 |
Configutation | Loggers | root | 루트 로거를 정의하는 항목 |
💡 사용예시
- 해당 예시에서는 로거를 통해 메시지가 어떤 수준에서 기록될 것인지를 결정합니다.
1. Loggers > Root
- 모든 로그의 기록하는 최상위 로거를 정의합니다.
- 루트 로거의 레벨로 'OFF'가 설정되어 있으며, 'console-appender'와 'rolling-file-appender'를 참조하고 있습니다.
2. Loggers > Logger
- 특정 패키지 또는 클래스에 대한 로그를 정의합니다.
- org.springframework와 com.adjh.multiflexapi 패키지에 대해 'INFO'와 'DEBUG' 레벨의 로그를 각각 정의하고 있으며, 각 로거는 'console-appender', 'file-info-appender', 'file-error-appender'를 참조하고 있습니다.
- MyBatis 관련 로그 레벨을 지정합니다. 특정 패키지 외에는 모두 'OFF'로 설정되어 있습니다. 'jdbc.sqltiming' 패키지만 'INFO' 레벨로 설정되어 있습니다.
Configutation:
# [Loggers] 로그 출력 범위를 정의
Loggers:
# [Loggers - Root] 모든 로그를 기록하는 최상위 로그를 정의
Root:
level: OFF
AppenderRef:
- ref: console-appender
- ref: rolling-file-appender
# [Loggers - Loggers] 특정 패키지나 클래스에 대한 로그를 정의
Logger:
# 1. Spring Framework 로그 레벨 'INFO' 정의
- name: org.springframework
additivity: "false"
level: INFO
AppenderRef:
- ref: console-appender
- ref: file-info-appender
- ref: file-error-appender
# 2. Spring Framework 로그 레벨 'DEBUG' 정의
- name: com.adjh.multiflexapi
additivity: "false"
level: DEBUG
AppenderRef:
- ref: console-appender
- ref: file-info-appender
- ref: file-error-appender
# 3. MyBatis 관련 로그 레벨 특정 패키지 외에는 모두 OFF
- name: jdbc
level: OFF
- name: jdbc.sqlonly
level: OFF
- name: jdbc.sqltiming
level: INFO
- name: jdbc.resultsettable
level: OFF
- name: jdbc.audit
level: OFF
- name: jdbc.resultset
level: OFF
- name: jdbc.connection
level: OFF
4) Log4j2 환경구성 설정 방법 : yaml을 이용한 방식
1. 기존 문제 확인
💡 기존 문제 확인
- 기존에는 log4j2 로그 환경설정 파일을 xml 형태로 관리가 되었습니다.
- xml은 yml 파일보다 상대적으로 가독성이 떨어진다는 단점을 가지고 기존 xml 파일을 yml 파일로 변경합니다.
💡 [참고] 이전에 xml 형태를 사용한 방법에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
2. 라이브러리 추가 : build.gradle
💡 의존성 주입
- 의존성 주입으로 Spring Boot Stater Log4j2를 받으며, yml 파일을 사용하기 위한 jackson-dataformat-yaml 라이브러리를 추가합니다.
dependencies {
implementation "org.springframework.boot:spring-boot-starter-log4j2" // Spring Boot Log4j2
implementation "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml"
}
[ 더 알아보기 ]
💡 jackson-dataformat-yaml
- yaml/yml 데이터 형식의 데이터를 처리하는 하며 읽기 쓰기에 대한 기능을 지원합니다.
Maven Repository: com.fasterxml.jackson.dataformat » jackson-dataformat-yaml
3. 로깅 라이브러리의 종속성 제외 : build.gradle
💡 로깅 라이브러리의 종속성 제외 : build.gradle
- spring-boot-starter-logging 내에 기존에 추상체로 지정되어 있는 Logback을 제외합니다.
- 이는 충돌이 발생할 수 있기에 제외합니다.
configurations {
compileOnly {
extendsFrom annotationProcessor
}
configureEach {
// spring-boot-starter-web 라이브러리에 포함되어 있는 logging의 종속성을 제외합니다.
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
}
4. properties 파일 내에 로깅 설정을 합니다. : application.properties
# default Logging 프레임워크 설정 파일을 참조
logging.config=classpath:log4j2/log4j2-local.yml
# or
# logging slf4j
logging:
# default Logging 프레임워크 설정 파일을 참조
config: classpath:log4j2/log4j2-local.yml
5. 위에서 지정한 경로에 yml 파일을 생성합니다.
6. 해당 파일들을 구성해 줍니다.: src/resources/log4j2-local.yml
💡 해당 파일들을 구성해 줍니다.
- 이전에 구성한 방식과 비교하여 yml 형태로 구성하였고 기존 Camel Case, Snake Case로 변수가 혼동되는 부분을 Dash Case로 변경하였습니다.
- 또한 위에서 설명한 내용을 기반으로 구성하였습니다.
Configutation:
# 구성 이름
name: multiflex-api-local
# [Properties] 설정에 사용되는 속성들을 정의
Properties:
Property:
- name: "log-path"
value: "./logs"
- name: "charset-UTF-8"
value: "UTF-8"
- name: "layout-pattern"
value: "%style{%d}{black} %highlight{%-5level} [%style{%t}{bright,blue}] %style{%C}{bright,yellow}: %msg%n%throwable"
- name: "info-log"
value: ${log-path}/tugboatApi/api-info.log
- name: "error-log"
value: ${log-path}/tugboatApi/api-error.log
- name: "auth-log"
value: ${log-path}/tugboatApi/api-auth.log
- name: "json-log"
value: ${log-path}/tugboatApi/api-json-info.log
# [Appenders] 로그 기록방식 정의
Appenders:
# [Appenders - Console] 콘솔에 로그를 출력하는 방식 정의
Console:
- name: console-appender
target: SYSTEM_OUT
PatternLayout:
pattern: ${layout-pattern}
# [Appenders - RollingFile] 로그를 파일들을 압축파일로 출력하는 방식 정의
RollingFile:
name: rolling-file-appender
fileName: ${log-path}/rolling-file-log.log
filePattern: "${log-path}/archive/rollingFile.log.%d{yyyy-MM-dd-hh-mm}_%i.gz"
PatternLayout:
charset: ${charset-UTF-8}
pattern: ${layout-pattern}
Policies:
SizeBasedTriggeringPolicy:
size: "200KB"
TimeBasedTriggeringPolicy:
interval: "1"
DefaultRollOverStrategy:
max: "30"
fileIndex: "max"
# [Appenders - File] 로그를 파일로 기록하는 방식 정의
File:
- name: file-info-appender
fileName: ${info-log}
PatternLayout:
pattern: "%d %p %C{1.} [%t] %m%n"
- name: file-error-appender
fileName: ${error-log}
PatternLayout:
pattern: "%d %p %C{1.} [%t] %m%n"
- name: file-auth-appender
fileName: ${auth-log}
PatternLayout:
pattern: "%d %p %C{1.} [%t] %m%n"
- name: file-json-info-appender
fileName: ${json-log}
PatternLayout:
pattern: "%d %p %C{1.} [%t] %m%n"
# [Loggers] 로그 출력 범위를 정의
Loggers:
# [Loggers - Root] 모든 로그를 기록하는 최상위 로그를 정의
Root:
level: OFF
AppenderRef:
- ref: console-appender
- ref: rolling-file-appender
# [Loggers - Loggers] 특정 패키지나 클래스에 대한 로그를 정의
Logger:
# 1. Spring Framework 로그 레벨 'INFO' 정의
- name: org.springframework
additivity: "false"
level: INFO
AppenderRef:
- ref: console-appender
- ref: file-info-appender
- ref: file-error-appender
# 2. Spring Framework 로그 레벨 'DEBUG' 정의
- name: com.adjh.multiflexapi
additivity: "false"
level: DEBUG
AppenderRef:
- ref: console-appender
- ref: file-info-appender
- ref: file-error-appender
# 3. MyBatis 관련 로그 레벨 특정 패키지 외에는 모두 OFF
- name: jdbc
level: OFF
- name: jdbc.sqlonly
level: OFF
- name: jdbc.sqltiming
level: INFO
- name: jdbc.resultsettable
level: OFF
- name: jdbc.audit
level: OFF
- name: jdbc.resultset
level: OFF
- name: jdbc.connection
level: OFF
[ 더 알아보기 ]
💡yaml/yml 파일 내에서 Boolean 형을 String으로 작성한 이유는?
- yaml 1.2 버전에서는 기존 1.1에 비해 엄격하게 적용하여 ‘true’ / ‘false’에 대해 유효한 Boolean으로 허용이 된다고 합니다.
- 참고 글 : https://support.oneskyapp.com/hc/en-us/articles/222417827-Why-do-my-yes-no-keys-in-my-YML-file-change-to-boolean-true-false-
Why do my yes/no keys in my YML file change to boolean true/false?
7. 직접 호출을 합니다
💡직접 호출을 합니다.
- api/v1/code/codes로 호출을 하였을때 "코드의 모든 리스트를 조회합니다."라는 메시지가 나옵니다.
1. @Slf4j 어노테이션을 선언함으로 log4j2를 사용할 수 있게 됩니다.
2. 로그를 출력합니다.
/**
* 코드 정보를 관리하는 Controller
*/
// 1. Slf4j(인터페이스) 이용하여서 log4j2(구현체)를 사용합니다
@Slf4j
@RestController
@RequestMapping(value = "/api/v1/code")
public class CodeController {
private final CodeService codeService;
public CodeController(CodeService codeService) {
this.codeService = codeService;
}
/**
* [API] 코드 리스트 출력
*
* @param codeDto codeDto
* @return ApiResponseWrapper<ApiResponse> : 응답 결과 및 응답 코드 반환
*/
@PostMapping("/codes")
@Operation(summary = "코드 조회", description = "코드 조회")
public ResponseEntity<ApiResponse<Object>> selectCodeList(@RequestBody @Validated CodeDto codeDto) {
// 2. 로그를 출력합니다.
log.debug("코드의 모든 리스트를 조회합니다.");
ApiResponse<Object> ar = ApiResponse.builder()
.result(codeDto)
.resultCode(SuccessCode.SELECT.getStatus())
.resultMsg(SuccessCode.SELECT.getMessage())
.build();
return new ResponseEntity<>(ar, HttpStatus.OK);
}
}
💡 아래와 같이 입력한 콘솔이 출력이 잘 됨을 확인하였습니다.
5) 결과확인
1. 콘솔 비교 : 적용 이전과 적용 이후 비교
💡 적용 이전에는 모든 로깅이 출력되고 있습니다.
💡 변경 이후에는 확인할 데이터만 출력이 되고 있습니다.
2. 로그 파일 확인
💡 로그 파일 확인
- 아래와 같이 logs 경로 하위에 각각의 로그파일이 생성되고 계속 입력이 됩니다.
💡 [참고] Spring Boot Log4j2의 비동기 로깅에 대해 궁금하시면 아래의 링크를 참고하시면 도움이 됩니다.
오늘도 감사합니다. 😀
반응형