본문으로 바로가기

[Spring Boot] 스프링 부트 로그 설정 (log4j2)

category Backend/Spring 2021. 11. 22. 15:12

목차

    0. 환경

    • windows10
    • openjdk version "11" 2018-09-25
    • IntelliJ Tool
    • Spring Boot 2.5.6
    • Gradle Project 
    • MyBatis + Mysql + HikariCP를 이용해 DB(Mysql) 연동할 프로젝트입니다.

    1. 성능

    • log4j2는 Spring Boot에 기본으로 적용되어있는 logback 이후에 나온 라이브러리로 성능이 더 뛰어납니다.
    • 멀티스레드 환경에서 Async Logger의 경우 Logback보다 처리량이 18배 더 높고 대기 시간이 훨씬 더 짧다고 합니다.
    • 성능에 대한 자세한 내용은 https://logging.apache.org/log4j/2.x/performance.html를 참고하세요.

    https://logging.apache.org/log4j/2.x/performance.html

    2. Log4j2 의존성 추가

    • build.gradle에 log4j2 의존성을 추가합니다.
    • logback이랑 충돌을 방지하기 위해 spring-boot-starter-logging를 제외합니다.
    configurations {
    	compileOnly {
    		extendsFrom annotationProcessor
    	}
    	all {
    		//logback과의 충돌 방지
    		exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    	}
    }
    
    dependencies {
    	implementation 'org.springframework.boot:spring-boot-starter-log4j2'
    }

    3. 설정파일

    • Log4j2.xml 파일을 추가합니다.
    • resources/log4j2.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration>
    
        <!-- 해당 설정파일에서 사용하는 프로퍼티-->
        <Properties>
            <property name="LOGS_PATH">D:\test_logs</property>
        </Properties>
    
        <Appenders>
            <!-- 콘솔 -->
            <Console name="console" target="SYSTEM_OUT">
                <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}:%-3relative] %-5level %logger{35} - %msg%n" />
            </Console>
    
            <!-- 파일 -->
            <RollingFile name ="RollingFile">
                <FileName>${LOGS_PATH}/log4j2.log</FileName>
                <FilePattern>${LOGS_PATH}/log4j2.%d{yyyy-MM-dd}.%i.log.gz</FilePattern>
                <PatternLayout>
                    <Pattern>%d{yyyy-MM-dd HH:mm:ss} %5p [%c] %m%n</Pattern>
                </PatternLayout>
                <Policies>
                    <SizeBasedTriggeringPolicy size="100MB"/>
                    <TimeBasedTriggeringPolicy interval = "1" modulate = "true"/>
                </Policies>
            </RollingFile>
        </Appenders>
    
        <Loggers>
            <!-- Application Loggers -->
            <!-- Root 보다 우선 순위가 높습니다. -->
            <logger name="com.test.api.controller" level="INFO" additivity="false">
                <AppenderRef ref="console" />
                <AppenderRef ref="RollingFile" />
            </logger>
    
            <logger name="com.test.api.service" level="INFO" additivity="false">
                <AppenderRef ref="console" />
                <AppenderRef ref="RollingFile" />
            </logger>
    
            <!-- FATAL, ERROR, WARN, INFO, DEBUG, TRACE -->
            <Root level="INFO">
                <AppenderRef ref="console" />
                <AppenderRef ref="RollingFile" />
            </Root>
        </Loggers>
    </Configuration>

    4. 테스트

    package com.test.api.controller;
    
    import lombok.extern.log4j.Log4j2;
    import org.springframework.web.bind.annotation.GetMapping;
    
    @Log4j2
    @RestController
    public class TestController {
    
        @GetMapping(value = "/log")
        public void log() throws Exception {
    
            //FATAL, ERROR, WARN, INFO, DEBUG, TRACE
            log.fatal("FATAL");
            log.error("ERROR");
            log.warn("WARN");
            log.info("INFO");
            log.debug("DEBUG");
            log.trace("TRACE");
        }
    
    }​

     

    [콘솔 출력]

    • logger level을 INFO이기 때문에 debug와 trace는 출력되지 않았습니다.
    • <logger name="com.test.api.controller" level="INFO" additivity="false">
    • TRACE  <  DEBUG  <  INFO  <  WARN  <  ERROR < FATAL 

     

    [파일 생성]

    5. 취약점 조치

    • 최근에 log4j2 취약점이 등장했습니다. 2.15 버전 미만인 경우 아래의 링크로 접속해 버전 업데이트 해주세요.

    https://veneas.tistory.com/entry/Spring-Boot-스프링-부트-Log4J2-취약점-조치-Log4J2-버전-업데이트

     

    [Spring Boot] 스프링 부트 Log4J2 취약점 조치 (Log4J2 버전 업데이트)

    목차 0. 조치 환경 Spring Boot 2.5.6 (Gradle Project) JDK 11(Java 11) IntelliJ [build.gradle = dependencies] 필자의 프로젝트의 dependencies는 다음과 같습니다. dependencies { implementation 'org.sprin..

    veneas.tistory.com