Spring

Spring Boot + log4j2

Beekei 2021. 10. 7. 17:34
반응형

log4j(Log For JAVA)란?

Java 기반 Logging 유틸리티로써 debug용 도구로 주로 사용된다.

애플리케이션에 문제 발생 시 문제의 위치를 빠르고 정확히 파악하기 위해 사용한다.

또한 성능 및 속도에 영향을 미치지 않고 편리하게 사용할 수 있다.

log4j의 특징

  • 속도 최적화
  • thread-safe 하다. 즉, 멀티스레드 환경에서도 안전
  • properties 파일과 xml 형식으로 실행 중 수정 적용 가능
  • 5단계의 레벨의 장애를 사용(DEBUG < INFO < WARN < ERROR <  FATAL)
  • 출력 layout과 대상 및 방식을 쉽게 설정

구현 예제

1. build.gradle 설정

configurations {
	...
    // logback 의존성 제거
    // Spring Boot에는 logback이 기본 logging이기 때문에 의존성을 제거한다.
    all {
    	exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
	}
}

dependencies {
	...
    // log4j2
    implementation 'org.springframework.boot:spring-boot-starter-log4j2' // 의존성 주입
    ...
}

2. application.yml 설정


...

logging:
  config: classpath:log4j2.xml # log4j2 설정파일 경로 설정

3. log4j2.xml 생성

  • RollingFile.fileName : 저장할 로그 파일
  • RollingFile.filePattern : Rolling될 로그 파일
RollingFile.filePattern 설명
%d{yyyy-MM-dd-hh-mm} .log.zip TimeBasedTriggeringPolicy 태그에 interval = 1일떄 1분마다 Rolling
%d{yyyy-MM-dd-hh} .log.zip TimeBasedTriggeringPolicy 태그에 interval = 1일떄 1시간마다 Rolling
%d{yyyy-MM-dd} .log.zip TimeBasedTriggeringPolicy 태그에 interval = 1일떄 1일마다 Rolling
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info" monitorInterval="30">
    <!--변수 설정-->
    <Properties>
        <Property name="BASE_DIR">./logs</Property> <!--로그 파일 경로-->
        <Property name="LOG_FORMAT">[%date{yyyy-MM-dd HH:mm:ss}][%level][%file:%line] %msg%n</Property><!--로그 출력 형태-->
    </Properties>

    <Appenders>
        <!--콘솔 로그-->
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_FORMAT}"/>
        </Console>

        <!--로그 파일-->
        <RollingFile name="File" fileName="${BASE_DIR}/logs.log" filePattern="${BASE_DIR}/%d{yyyy-MM-dd}.logs.zip">
            <PatternLayout pattern="${LOG_FORMAT}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!-- 매일(yyyy-MM-dd) log zip파일 생성 -->
            </Policies>
            <DefaultRolloverStrategy>
                <Delete basePath="${BASE_DIR}">
                    <IfAccumulatedFileCount exceeds="4"/>   <!-- log 파일이 4개 이상일때 예전 log 파일 삭제-->
                    <!-- <IfFileName glob="*.log"/> --> <!-- 삭제할 파일명 -->
                    <!-- <IfLastModified age="3d"/> --> <!-- 마지막 로그가 찍히고 3일 이상된 log 파일 삭제 -->
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>

    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="File"/>
        </Root>
        <Logger name="com.example.logdemo" level="WARN" additivity="false">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="File"/>
        </Logger>
    </Loggers>
</Configuration>

4. Test

@RestController
@RequestMapping(value = "log")
public class LogController {

    private final Logger logger = LogManager.getLogger(this.getClass());

    @GetMapping(name = "로그 확인", value = "check")
    public void logCheck() {
        logger.debug("Hello Debug level log");
        logger.info("Hello Info level log");
        logger.warn("Hello Warn level log");
        logger.error("Hello Error level log");
    }

}
[2021-10-07 16:56:01][WARN][UserController.java:11] Hello Warn level log
[2021-10-07 16:56:01][ERROR][UserController.java:12] Hello Error level log

log4j2.xml에 설정한 로그 파일 경로에 파일이 생성되고 로그가 저장된 것을 확인할 수 있다.

 

 

참고

 

[Spring Boot]log4j2 RollingFileAppender 튜토리얼

사용 된 기술 :   Java SE 1.8 | Log4j 2.8.2 | 메이븐 3.3.9 | Jackson API 2.8.7 | Eclipse Neon.3 RollingFileAppender는 특정 크기 제한에 도달하거나 날짜 / 시간 패턴이 더 이상 적용되지 않으면 로그..

penthegom.tistory.com

반응형