카테고리 없음

[Spring] 배포 환경별 로그 (logging) 설정하기

Jay Tech 2019. 9. 12. 13:55
반응형

배포 환경별 로그 설정하기

 

본 내용은 필자가 공부하면서 적용해본 것이므로 best practice가 아닐 수 있습니다. 본인의 프로젝트에 맞는 방향으로 참고만 하면 될 것 같네요.

 

 

지난 글에서는 젠킨스를 활용하여 배포까지 해보았다.

https://pjh3749.tistory.com/261

 

[Spring] Jenkins(젠킨스)를 활용한 스프링부트 앱 간단 배포하기

젠킨스를 활용한 스프링부트 앱 배포 젠킨스란? 젠킨스란 소프트웨어 개발 시 지속적 통합 (Continuous Integration) 서비스를 제공하는 툴이다. 젠킨스의 공식 홈페이지를 가보자. 메인화면에 젠킨스의 장점들을..

pjh3749.tistory.com

이제는 여러 서버별로 배포를 할 때 각자 다른 설정으로 배포를 해보려고 한다.

예를들어, 하나의 애플리케이션을 배포하지만 개발용 서버에는 개발서버에서 하려고하는 설정으로, 운영서버에는 운영서버에서 하려고 하는 설정으로 배포를 하는 것이다.

 

 

먼저 전체적인 그림을 보면 다음과 같다.

간략한 배포 환경

젠킨스가 개발 서버에서는 profiles을 dev로 설정하고 운영서버에는 profile을 prod로 설정을 해서 배포를 한다. 먼저 저장소에서 코드를 가져와서 빌드를 하고 jar 파일들을 전송을 했다. (지난 게시글 참고)

그리고 배포를 할 때 환경변수를 넣어 주게 된다. 운영 환경마다 다른 설정파일을 읽게 하는 것이다. 그 설정파일들을 만드려고 한다면 다음과 같이 만들면 된다.

설정 파일들

 

제일 최상위, 그러니까 부모 설정파일 내용을 application.properties에 정의를 해놓는다.

최상위 application.properties

 

그리고 다음과 같이 써 볼 수 있다. (참고로 yml로 작성하는 것이 더 가독성이 좋고 편하다. properties로 작성한 이유는, 사실 아무이유없고 그냥 해본 것이다. 그리고 저 properties파일들을 폴더를 나눠서 깔끔하게 정리할 수 있다. 단 path를 지정해주어야 할 수 있다)

 

 

저 설정은 앱을 실행할 때 기본적으로 바라보게 하는 설정파일을 지정하는 것이다. 즉 local로 설정했기 때문에 application-local.properties라는 이름을 가진 설정파일을 default로 읽어오게 된다. 추후 다시 이야기 하겠지만 배포할 때 저 active 환경변수를 직접 넣어주면 다른 설정파일을 읽어올 수 있게 된다.

 

application-local.properties 파일의 내용

application-local.properties

이런식으로 로컬에서 개발할 때 필요한 설정을 적어주면된다. 프로젝트마다 다르기 때문에 알아서 적으면 된다.

단 맨 윗줄의 spring.profiles.include라는 설정으로 로컬 환경에서의 profiles를 설정할 수 있다. 여기서는 배포 환경별 로그를 다르게 설정하는 것을 해볼 것이므로 console-logging이라는 profile을 정의해 준다.

 

logback-spring.xml 파일을 만들어준다. 다음은 전체적인 결과파일이다.

목적은 로컬, 개발, 운영 환경에 따른 로그 설정이다. 비단 로그 뿐만아니라 데이터베이스와 같은 다른 미들웨어 설정까지 필요에 맞게 할 수 있다. 다시 말하지만 best practice가 아니므로 방법만 참고하고 본인에 맞는 설정을 하기 바란다.

상단에 console-logging이라는 profile 을 설정함으로써 local개발 환경에서는 console 로그만을 쓴다는 것을 명시해준다. 실 배포시에는 console 로그가 아닌 file 로그를 남길 것이다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <springProfile name="console-logging">
        <appender name="LOCAL_CONSOLE_POLICY" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <Pattern>%d{HH:mm:ss.SSS} [%-5level] [%thread] [%logger{36}] - %m%n</Pattern>
            </layout>
        </appender>
    </springProfile>

    <springProfile name="file-info-logging">
        <appender name="INFO_FILE_POLICY" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter" >
                <level>INFO</level>
            </filter>
            <file>${LOG_PATH}/zzazan/logs/zzazan.log</file>
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss} [%-5level] [%thread] [%logger{36}] - %m%n</pattern>
            </encoder>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <fileNamePattern>${LOG_PATH}/zzazan/dateLog/%d{yyyy_MM_dd}_%i.zzazan.log</fileNamePattern>
                <maxFileSize>50MB</maxFileSize>
                <maxHistory>14</maxHistory>
                <totalSizeCap>1GB</totalSizeCap>
            </rollingPolicy>
        </appender>
    </springProfile>

    <springProfile name="file-error-logging">
        <appender name="ERROR_FILE_POLICY" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter" >
                <level>ERROR</level>
            </filter>
            <file>${LOG_PATH}/zzazan/logs/zazzan_error.log</file>
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss} [%-5level] [%thread] [%logger{36}] - %m%n</pattern>
            </encoder>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <fileNamePattern>${LOG_PATH}/zzazan/dateLog/%d{yyyy_MM_dd}_%i.zazzan_error.log</fileNamePattern>
                <maxFileSize>50MB</maxFileSize>
                <maxHistory>14</maxHistory>
                <totalSizeCap>1GB</totalSizeCap>
            </rollingPolicy>
        </appender>
    </springProfile>

    <root level="INFO">
        <springProfile name="console-logging">
            <appender-ref ref="LOCAL_CONSOLE_POLICY"/>
        </springProfile>

        <springProfile name="file-info-logging">
            <appender-ref ref="INFO_FILE_POLICY"/>
        </springProfile>

        <springProfile name="file-error-logging">
            <appender-ref ref="INFO_FILE_POLICY"/>
            <appender-ref ref="ERROR_FILE_POLICY"/>
        </springProfile>
    </root>
</configuration>

 

로깅 policy에 대한 내용은 따로 검색해보면 자료가 많이 나와있다. 기본적으로 로그를 2주치를 남겨보았고 size 상한선도 줘 보았다.

마찬가지로 application-prod.properties에는 운영환경에 대한 설정을 해준다. dev는 INFO레벨 까지만 로그를 쌓았는데 그냥 prod와 차이를 둬 보기 위해서 그렇게 했다. 맨 하단에는 springProfile name=file-error-logging이라고 설정해주고 application-prod.properties에

spring.profiles.include=file-info-logging, file-error-logging

 

이것을 추가하자.

참고로 file로 로그를 남길 때는 서버의 디렉터리를 지정해주어야한다. 위의 xml에서

 

<file>${LOG_PATH}/zzazan/logs/zazzan_error.log</file>

 

이 부분을 보자. ${LOG_PATH}라는 변수에 디렉터리를 쭉 지정해주고 에러관련 로그파일이름을 지정해주었다. 그렇다면 애플리케이션에서 log.error로 찍은 것들이 저 파일안에 쌓일 것이다.

 

LOG_PATH는 운영체제별로 다르다. 필자는 ubuntu를 사용했는데 PATH가 기본적으로 /home/ubuntu 이다. 그렇기 때문에 properties 파일에 logging.path 라는 설정도 지정해주자. 그러면 xml 파일에서 ${LOG_PATH}로 접근할 수 있다.

 

logging.path=/home/ubuntu

 

마지막으로 배포 스크립트에서 

nohup java -jar -Dspring.profiles.active=prod /home/ubuntu/zzazan/deploy/zzazanstagram-0.0.1-SNAPSHOT.jar

jvm 환경변수의 -Dspring옵션을 넣어준다. (dev, prod 등 본인이 설정한 profiles의 이름)

배포 스크립트의 전체적인 모습을 보려면 이전 게시글

2019/08/24 - [프로그래밍/Spring] - [Spring] Jenkins(젠킨스)를 활용한 스프링부트 앱 간단 배포하기

을 참조하자.

반응형