[Spring] 여러 active profile을 사용할 때 logback 설정

by 스뎅(thDeng) on

이런 logback 설정이 있었다.

<if condition='"${spring.profiles.active}".equals("alpha")'>
     <then>
        <logger name="kr.leocat.test" level="INFO">
            <appender-ref ref="myLogger" />
        </logger>
    </then>
</if>

일반적인 (active profile을 1개만 쓰는) 경우에는 문제가 되지 않았다. 그런데, 이렇게 String.equals()로 비교하는 것은 여러개 profile을 active 시킬 수 있다는 점이 문제가 된다.

-Dspring.profiles.active="alpha,dev"
-Dspring.profiles.active="alpha,swagger"

위와 같이 alpha와 함께 dev, swagger 같은 profile을 함께 사용한다면, String.equals()로 비교하는 logback 설정은 원하는 형태로 동작하지 않는다. 그렇다고 String.contains()로 비교하는 것은 부정확할 수도 있고, 정확한게 만들자니 condition이 길어질 수 있어서 설정파일을 읽기 어려워 지는 문제가 생길 수 있다.

이럴 때 사용할 만한 것으로 spring logback extension이 있다.

<springProfile name="alpha">
    <logger name="kr.leocat.test" level="INFO">
        <appender-ref ref="myLogger" />
    </logger>
</springProfile>

위와 같이 설정하면 -Dspring.profiles.active="alpha,dev"처럼 여러 profile이 active 되어 있어도 alpha profile이 포함되어 있으면 해당 설정이 추가된다. 아래처럼 활용할 수 있다.

<springProfile name="dev">
    <!-- 'dev' profile이 active일 때 설정 -->
</springProfile>
<springProfile name="dev, alpha, beta">
    <!-- 'dev'나 'alpha', 'beta' profile이 active일 때 설정 -->
</springProfile>
<springProfile name="!production">
    <!-- 'production' profile이 active 아닐 때 설정 -->
</springProfile>

주의점 logback.xml 파일은 일찍 로딩되기 때문에, spring이 이 설정을 제대로 로딩하려면 logback-spring.xml 파일로 설정하거나 logging.config property로 설정하기를 권장한다고 문서에 적혀 있다.

참고

별도로 명시하지 않을 경우, 이 블로그의 포스트는 다음 라이선스에 따라 사용할 수 있습니다: Creative Commons License CC Attribution-NonCommercial-ShareAlike 4.0 International License