Java/Spring

[Java] Slf4j - Log4j2 설정

조각남자 2024. 8. 26. 11:49

 

💡 Spring Validation 구성을 위한 사용된 개발환경 입니다

 

개발 환경 버전
java 17
Spring Boot 3.3.3
빌드관리도구 Gradle 8.8
개발 툴 IntelliJ IDEA 2024.1
spring-boot-starter-validation 3.3.3



1)  Slf4j + Log4j2 라이브러리 적용하기

 


 

💡 로깅 프레임워크의 추상체(interface)인 Slf4j를 사용하며 구현체(implements)로 Log4j2를 통하여 로그를 구현합니다.

💡  spring-boot-starter-web 라이브러리 내에는 추상체로 Slf4j와 구현체 'Logback'을 내장하고 있어서 구현체(Logback)를 제외하고 적용합니다.

 

 

1. 빌드 관리도구에 라이브러리 종속성 제외


 

💡 spring-boot-starter-web 내에 기존에 추상체로 지정되어 있는 Logback을 제외합니다. 이는 충돌이 발생할 수 있기에 제외합니다.

💡 로깅 프레임워크의 추상체(interface)인 Slf4j를 사용하며 구현체(implements)로 Log4j2를 통하여 로그를 구현합니다.

💡  spring-boot-starter-web 라이브러리 내에는 추상체로 Slf4j와 구현체 'Logback'을 내장하고 있어서 구현체(Logback)를 제외하고 적용합니다.

 


💡 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

# .yml 버젼
logging.config=classpath:log4j2/log4j2-local.yml

# .xml 버젼
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.www.springlog4j2" additivity="false" level="DEBUG">
      <AppenderRef ref="Console_Appender"/>
      <AppenderRef ref="File_Info_Appender"/>
      <AppenderRef ref="File_Auth_Appender"/>
      <AppenderRef ref="File_Json_info_Appender"/>
    </logger>

    <!-- AUTH 관련 로그  -->
    <logger name="com.www.springlog4j2.controller" additivity="false" level="INFO,DEBUG">
      <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>

 

 

5. src/main/resoruce/log4j2/log4j2-local.yml 파일 내에 로그 환경설정을 합니다.


Configutation:
  # 구성 이름
  name: api

  # [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}/api/api-info.log
      - name: "error-log"
        value: ${log-path}/api/api-error.log
      - name: "auth-log"
        value: ${log-path}/api/api-auth.log
      - name: "json-log"
        value: ${log-path}/api/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.www.springlog4j2
        additivity: "false"
        level: DEBUG
        AppenderRef:
          - ref: console-appender
#          - ref: file-info-appender
          - ref: file-json-info-appender
          - ref: file-auth-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

 

 

5) 참고 : 프로젝트 내의 로그가 출력되지 않는 경우

 

⭐️ 주의 사항 ⭐️

💡 해당 파일에서 중요한 부분은 "com.pacakge.projectname" 해당 부분인데, build.gradle 파일 내에 group 속성에 해당하는 값을 복사하여서 추가하셔야 합니다.

💡 그래야 프로젝트에서 log.info / log.debug와 관련된 로그를 사용하였을 때 프로젝트 내의 콘솔에 찍히는 것을 확인할 수 있습니다.

 

 

 

 

 

 

# 적용한 github

https://github.com/eoog/blog/tree/main/spring-Log4j2

 

blog/spring-Log4j2 at main · eoog/blog

:seedling: 조각남자 티스토리 블로그 기록 내용. Contribute to eoog/blog development by creating an account on GitHub.

github.com