Java/Spring Boot

[Java] Spring Boot Log4j2 이해하기 -1 : 주요 특징, 구성 요소, yml 설정방법

adjh54 2024. 1. 14. 00:47
반응형
해당 글에서는 Log4j2에 대해 이해하고 Spring Boot 환경에서 Log4j2를 설정하는 방법에 대해 알아봅니다.



 

 

💡 [참고] xml 형태로 간단한 설정을 하는 방법에 대해 알고 싶으시면 이전에 작성한 글을 참고하시면 도움이 됩니다.
 

[Java/Library] Slf4j - Log4j2 이해하고 설정하기

해당 글에서는 로깅 라이브러리에 대해 이해를 하고 개발환경을 구성하는 것을 목적으로 작성하였습니다 1) 개발 환경 💡 해당 글은 Spring Boot 내에 로깅 라이브러리를 적용한 개발 환경입니다.

adjh54.tistory.com

 

 

 

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배 빠릅니다.
- 비동기 로거의 처리량은 스레드 수에 따라 증가하는 반면, 동기 로거와 비동기 어펜더는 모두 로깅을 수행하는 스레드 수에 관계없이 다소 일정한 처리량을 갖습니다.

https://logging.apache.org/log4j/2.x/manual/async.html#logging-peak-throughput

 

 

2. 다양한 형식의 로깅 설정 지원


💡 다양한 형식의 로깅 설정 지원

- Log4j2는 다양한 애플리케이션과 환경에 맞게 로깅을 구성할 수 있도록 지원합니다. XML, JSON, YAML, Properties 등 다양한 형식으로 로깅 설정을 할 수 있습니다.

https://logging.apache.org/log4j/2.x/manual/configuration.html#configuration

형식 설명
XML XML 형태로 로깅 환경 설정파일을 구성할 수 있습니다
JSON JSON 형태로 로깅 환경 설정파일을 구성할 수 있습니다
YAML YAML 형태로 로깅 환경 설정파일을 구성할 수 있습니다
Properties Properties 형태로 로깅 환경 설정파일을 구성할 수 있습니다

 

 

 

3. 다양한 Appender 지원


💡 다양한 Appender 지원

- Appender는 로그 메시지의 기록방식을 정의합니다.

- 아래와 같이 콘솔, 파일, 데이터베이스, JMS, NoSQL 등 다양한 출력 대상(Appender)을 지원합니다.

https://logging.apache.org/log4j/2.x/manual/appenders.html

 

4. 필터링 지원


💡 필터링 지원

- 로그 이벤트를 필터링하는 데 사용되는 다양한 필터들을 제공합니다.

- 필터는 로그 이벤트가 로그 설정에 지정된 기준을 충족하는지 여부를 결정하는 역할을 합니다

https://logging.apache.org/log4j/2.x/manual/filters.html

 

필터 이름 설명
BurstFilter 로그 이벤트를 순간적으로 제한하는데 사용됩니다.
CompositeFilter 여러 필터를 결합하여 사용하며, 필터들은 지정된 순서대로 실행됩니다.
DynamicThresholdFilter 로그 이벤트의 심각도에 따라 동적으로 임계값을 조정합니다.
MapFilter 특정 맵핑 값에 따라 로그 메시지를 필터링합니다.
MarkerFilter 로그 이벤트에 지정된 마커가 포함되어 있는지 여부에 따라 필터링합니다.
RegexFilter 로그 이벤트를 정규 표현식을 사용하여 필터링합니다.
Script 사용자 정의 스크립트를 이용하여 로그 이벤트를 필터링합니다.
ThresholdFilter 로그 이벤트의 심각도가 특정 임계값보다 높거나 낮은 경우 필터링합니다.
TimeFilter 로그 이벤트가 특정 시간 범위에 속하는지 여부에 따라 필터링합니다.

 

 

5. 플러그인 아키텍처


💡 플러그인 아키텍처

- Log4j2는 사용자 정의 플러그인을 쉽게 개발하고 배포할 수 있는 플러그인 아키텍쳐를 제공합니다.
 

Log4j – Log4j 2 Plugins

Plugins Introduction Log4j 1.x allowed for extension by requiring class attributes on most of the configuration declarations. In the case of some elements, notably the PatternLayout, the only way to add new pattern converters was to extend the PatternLayou

logging.apache.org

 

 

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"를 가집니다.
 

Log4j – Configuring Log4j 2

Configuration Inserting log requests into the application code requires a fair amount of planning and effort. Observation shows that approximately 4 percent of code is dedicated to logging. Consequently, even moderately sized applications will have thousan

logging.apache.org

 

 

2. Properties


💡 Properties

- Log4j2 구성에서 사용할 수 있는 ‘변수를 정의’하는 데 사용됩니다.


- 이 속성을 통해 로그 파일의 이름이나 경로와 같은 값을 중앙에서 관리하도록 할 때 유용합니다.
1차 분류 2차 분류 3차 분류 속성 설명
Configutation       설정 관련 환경을 정의하는 최상위 태그입니다.
Configutation Properties     설정에 사용되는 속성들을 정의하는 태그입니다.
Configutation Properties Property   속성의 변수로 이름과 값을 정의하는 태그입니다.
Configutation Properties Property name 속성으로 사용될 변수명을 정의하는 태그입니다.
Configutation Properties Property value 속성으로 사용될 변수명에 대한 값을 정의하는 태그입니다.
 

Log4j – Configuring Log4j 2

Configuration Inserting log requests into the application code requires a fair amount of planning and effort. Observation shows that approximately 4 percent of code is dedicated to logging. Consequently, even moderately sized applications will have thousan

logging.apache.org

 

💡 사용예시

- 아래와 같은 형태로 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 파일에 로그 메시지를 쓰되 파일 크기가 특정 크기에 도달하면 새 파일에 작성하는 방식

 

 

Log4j – Log4j 2 Appenders

facility String The facility is used to try to classify the message. The facility option must be set to one of "KERN", "USER", "MAIL", "DAEMON", "AUTH", "SYSLOG", "LPR", "NEWS", "UUCP", "CRON", "AUTHPRIV", "FTP", "NTP", "AUDIT", "ALERT", "CLOCK", "LOCAL0",

 

 

 

 

logging.apache.org

 

 

💡 사용예시

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 형태를 사용한 방법에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
 

[Java/Library] Slf4j - Log4j2 이해하고 설정하기

해당 글에서는 로깅 라이브러리에 대해 이해를 하고 개발환경을 구성하는 것을 목적으로 작성하였습니다 1) 개발 환경 💡 해당 글은 Spring Boot 내에 로깅 라이브러리를 적용한 개발 환경입니다.

adjh54.tistory.com

 

 

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의 비동기 로깅에 대해 궁금하시면 아래의 링크를 참고하시면 도움이 됩니다.
 

[Java] Spring Boot Log4j2 이해하기 -2 : 비동기 로깅(Asynchronous Loggers)

해당 글에서는 Spring Boot 환경에서 Log4j2를 이용하여 비동기 로깅에 대해 이해하고 사용하는 방법에 대해 알아봅니다. 💡 [참고] Log4j2에 대해 상세하게 궁금하시거나 동기식 로깅을 원하시면 아

adjh54.tistory.com

 

 

 

오늘도 감사합니다. 😀

 

 

 

반응형