프레임워크/스프링 부트

Spring Boot3 (스프링 부트3) 에서 Log4j2 세팅 방법

Jake Seo 2024. 2. 2. 16:49

Spring Boot3 에서 Log4j2 세팅 방법

  • 버전은 스프링 부트 3 현재 최신 버전 (2024-02-02) 을 기준으로 한다.
  • 패키지 관리 도구는 Gradle 이용을 기준으로 한다.

스프링부트 기본 제공 Logback 을 의존성에서 제거

  • Spring Boot 의 기본 로깅 도구 Logback 을 의존성에서 제거한다.
  • dependencies 아래에 configurations 영역을 추가해주고 아래 내용을 붙여넣는다.
dependencies {
  // ...
}

// 추가
configurations {
    all*.exclude module: 'spring-boot-starter-logging'
}

의존성 제거 전

picture 1

의존성 제거 후

  • spring-boot-starter-logging 이 사라진 것을 확인할 수 있다.

picture 2

log4j2 의존성 추가하기

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-log4j2'
}

환경별 log4j2.xml 파일 작성하기

  • 이번 경우엔 ERROR 레벨부터 로깅하는 운영 환경과 INFO 레벨부터 로깅하는 개발 환경이 필요했다.
  • 운영 환경에서는 기본 정책으로 매 시간마다 파일을 롤링한다.
  • 개발 환경에서는 기본 정책으로 더 짧게 매 분마다 파일을 롤링한다.

log4j2-dev.xml

  • 개발 환경의 XML 파일을 작성한다.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Properties>
        <Property name="LOG_PATH">logs</Property>
        <Property name="DEFAULT_PATTERN">[%d{yyyy-MM-dd HH:mm:ss.SSS}] %5p ${sys:PID} --- [%15.15t] %-40.40c{1.} : %m%n%xwEx</Property>
        <Property name="COLOR_PATTERN">[%clr{%d{yyyy-MM-dd HH:mm:ss.SSS}}{faint}] %clr{%5p} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c}{cyan} %clr{:}{faint} %m%n%xwEx</Property>
        <Property name="TEST_PATTERN">%d %5p [%c] %m%n</Property>
    </Properties>

    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${COLOR_PATTERN}"/>
        </Console>

        <RollingFile name ="RollingFileAppender">
            <FileName>${LOG_PATH}/log4j2.log</FileName>
            <FilePattern>${LOG_PATH}/log4j2.%d{yyyy-MM-dd-hh-mm}.%i.log</FilePattern>
            <PatternLayout>
                <Pattern>${DEFAULT_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="100MB"/>
                <TimeBasedTriggeringPolicy interval = "1" modulate = "true"/>
            </Policies>
        </RollingFile>

        <RollingFile name ="RollingFileErrorAppender">
            <FileName>${LOG_PATH}/log4j2_error.log</FileName>
            <FilePattern>${LOG_PATH}/log4j2_error.%d{yyyy-MM-dd-hh-mm}.%i.log</FilePattern>
            <PatternLayout>
                <Pattern>${DEFAULT_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="100MB"/>
                <TimeBasedTriggeringPolicy interval = "1" modulate = "true"/>
            </Policies>
        </RollingFile>
    </Appenders>


    <Loggers>
        <!-- Root : 일반적인 로그 정책, 반드시 하나 정의해야함 -->
        <Root level="INFO" additivity="false">
            <AppenderRef ref="ConsoleAppender"/>
            <AppenderRef ref="RollingFileAppender"/>
            <AppenderRef ref="RollingFileErrorAppender" level="ERROR" />
        </Root>

        <!-- springframework logger -->
        <Logger name="org.springframework" level="INFO" additivity="false">
            <AppenderRef ref="ConsoleAppender" />
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>

        <!-- jdbc logger -->
        <Logger name="jdbc.sqlonly" level="OFF" additivity="false">
            <AppenderRef ref="ConsoleAppender"/>
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>

        <Logger name="jdbc.sqltiming" level="INFO" additivity="false">
            <AppenderRef ref="ConsoleAppender"/>
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>

        <Logger name="jdbc.resultsettable" level="INFO" additivity="false">
            <AppenderRef ref="ConsoleAppender"/>
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>

        <Logger name="jdbc.audit" level="OFF" additivity="false">
            <AppenderRef ref="ConsoleAppender"/>
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>

        <Logger name="jdbc.resultset" level="OFF" additivity="false">
            <AppenderRef ref="ConsoleAppender"/>
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>

        <Logger name="jdbc.connection" level="OFF" additivity="false">
            <AppenderRef ref="ConsoleAppender"/>
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>
    </Loggers>
</Configuration>

log4j2-prod.xml

  • 운영 환경의 XML 파일을 작성한다.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Properties>
        <Property name="LOG_PATH">logs</Property>
        <Property name="DEFAULT_PATTERN">[%d{yyyy-MM-dd HH:mm:ss.SSS}] %5p ${sys:PID} --- [%15.15t] %-40.40c{1.} : %m%n%xwEx</Property>
        <Property name="COLOR_PATTERN">[%clr{%d{yyyy-MM-dd HH:mm:ss.SSS}}{faint}] %clr{%5p} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c}{cyan} %clr{:}{faint} %m%n%xwEx</Property>
        <Property name="TEST_PATTERN">%d %5p [%c] %m%n</Property>
    </Properties>

    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${COLOR_PATTERN}"/>
        </Console>

        <RollingFile name ="RollingFileAppender">
            <FileName>${LOG_PATH}/log4j2.log</FileName>
            <FilePattern>${LOG_PATH}/log4j2.%d{yyyy-MM-dd-hh}.%i.log</FilePattern>
            <PatternLayout>
                <Pattern>${DEFAULT_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="100MB"/>
                <TimeBasedTriggeringPolicy interval = "1" modulate = "true"/>
            </Policies>
        </RollingFile>

        <RollingFile name ="RollingFileErrorAppender">
            <FileName>${LOG_PATH}/log4j2_error.log</FileName>
            <FilePattern>${LOG_PATH}/log4j2_error.%d{yyyy-MM-dd-hh}.%i.log</FilePattern>
            <PatternLayout>
                <Pattern>${DEFAULT_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="100MB"/>
                <TimeBasedTriggeringPolicy interval = "1" modulate = "true"/>
            </Policies>
        </RollingFile>
    </Appenders>


    <Loggers>
        <!-- Root : 일반적인 로그 정책, 반드시 하나 정의해야함 -->
        <Root level="ERROR" additivity="false">
            <AppenderRef ref="ConsoleAppender"/>
            <AppenderRef ref="RollingFileAppender"/>
            <AppenderRef ref="RollingFileErrorAppender" level="ERROR" />
        </Root>

        <!-- springframework logger -->
        <Logger name="org.springframework" level="INFO" additivity="false">
            <AppenderRef ref="ConsoleAppender" />
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>

        <!-- jdbc logger -->
        <Logger name="jdbc.sqlonly" level="OFF" additivity="false">
            <AppenderRef ref="ConsoleAppender"/>
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>

        <Logger name="jdbc.sqltiming" level="INFO" additivity="false">
            <AppenderRef ref="ConsoleAppender"/>
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>

        <Logger name="jdbc.resultsettable" level="INFO" additivity="false">
            <AppenderRef ref="ConsoleAppender"/>
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>

        <Logger name="jdbc.audit" level="OFF" additivity="false">
            <AppenderRef ref="ConsoleAppender"/>
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>

        <Logger name="jdbc.resultset" level="OFF" additivity="false">
            <AppenderRef ref="ConsoleAppender"/>
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>

        <Logger name="jdbc.connection" level="OFF" additivity="false">
            <AppenderRef ref="ConsoleAppender"/>
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>
    </Loggers>
</Configuration>

application.yml 파일 설정하기

  • application.yml 파일에서 각 profile 마다 사용할 log4j2 설정파일을 명시해준다.

로컬 환경 예시

spring:
  config:
    activate:
      on-profile: local
logging:
  config: classpath:log4j2-dev.xml

운영 환경 예시

spring:
  config:
    activate:
      on-profile: prod
logging:
  config: classpath:log4j2-prod.xml
반응형