java spring

Spring boot에 log4j2 적용하기

윤돌_99 2022. 2. 27. 18:55

- Log4j2 사용 배경

신입 1개월 차에 회사에서 Spring boot로  Proxy 서버를 만드는 과제를 받았다.

Proxy 서버의 기능이 어느정도 구현된 이후에 PO님께 미션을 받았다.

 

PO님 : 이제 이걸 백그라운드로 배포해야 하는데. log4j로 로그가 파일로 남기게 설정해주세요~

 

개발한 코드의 사후관리를 위해서는 모니터링이 꼭 필요하다.

이 모니터링을 위해서 애플리케이션의 로그를 파일로 남겨지도록 해야한다.

 


- Log4j2 적용 방법

 

1. build.gradle에 dependency 추가

 

Spring boot를 사용한다면 다음과 같이 dependency가 추가되어 있을 것이다.

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

Spring boot는 기본적으로 logback 로깅 모듈을 제공하기 때문에 이대로 사용한다면 log4j2와 충돌하여 오류를 맛볼 수 있다.

(logback을 사용해도 되지만 나는 log4j2가 더 성능이 좋아 log4j2를 사용하였다.)

 

 

그러므로 다음과 같은 코드를 추가하여 로깅 모듈을 제외시켜준다.

configurations {
    all {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    }
}

 

그런 다음 log4j2 dependency를 추가

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

 

2. log4j2.xml 파일 설정

 

(1) resource 폴더 아래 log4j2.xml 파일 추가

application.yml에 설정 하나하나를 추가해도 되지만, 그렇게 되면 커스터마이징 하기 어려워진다.

다음과 같이 resource 폴더 아래 log4j2.xml 파일 추가한다. (나는 log4j2-live.xml로 추가함)

 

 

 

 

(2) application.properties에 log4j2.xml 추가

 

사전에 application.properties 파일에 log 설정 파일을 지정한다.

logging.config=classpath:log4j2-live.xml

 

(3) log4j2.xml 작성

 

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">

    <Properties>
        <Property name="logFileName">daily-log</Property> //생성될 로그파일 이름
        <Property name="BASE_DIR">/root/logs</Property> // 로그파일이 생성될 경로
        //콘솔에 출력될 로그 레이아웃
        <Property name="consoleLayout">%style{%d{ISO8601}}{black} %highlight{%-5level }[%style{%t}{bright,blue}] %style{%C{1.}}{bright,yellow}: %msg%n%throwable</Property>
        <Property name="fileLayout">%d [%t] %-5level %c(%M:%L) - %m%n</Property> //생성될 로그 레이아웃
    </Properties>

    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${consoleLayout}" charset="UTF-8"/>
        </Console>

        <RollingFile name="file" fileName="logs/${logFileName}.log" filePattern="logs/${logFileName}.%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="${fileLayout}" />
            <LevelRangeFilter minLevel="ERROR" maxLevel="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="10 MB"/>
                <TimeBasedTriggeringPolicy modulate="true" interval="1" /><!-- 일별 로그 파일 생성-->
            </Policies>
            <DefaultRolloverStrategy max="25" fileIndex="min" >
                <Delete basePath="${BASE_DIR}">
                    <IfFileName glob="*.log" />
                    <IfLastModified age="10d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <RollingFile name="errorFile" fileName="logs/${logErrorFileName}.log" filePattern="logs/${logErrorFileName}.%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="${fileLayout}" />
            <LevelRangeFilter minLevel="ERROR" maxLevel="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="10 MB"/>
                <TimeBasedTriggeringPolicy modulate="true" interval="1" /><!-- 일별 로그 파일 생성-->
            </Policies>
            <DefaultRolloverStrategy max="25" fileIndex="min" >
                <Delete basePath="${BASE_DIR}">
                    <IfFileName glob="*.log" />
                    <IfLastModified age="10d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>

    <Loggers>

        <Root level="ALL">
            <AppenderRef ref="console"/>
        </Root>

        <!-- 스프링 프레임워크에서 찍는건 level을 info로 설정 -->
        <logger name="com.osci.atlasagent" additivity="true" >
            <AppenderRef ref="file"/>
            <AppenderRef ref="errorFile"/>
        </logger>

    </Loggers>
</Configuration>