본문 바로가기
공부/프로그래밍

[Spring] 환경에 따라 logback 설정파일 분리하기(springboot 아님)

by demonic_ 2019. 2. 26.
반응형

환경에 따라(dev, pord, local 등) logback 의 설정파일을 달리 읽히게 할 필요가 있었다.

그래서 인터넷에 검색하여 logback-[xxx].xml 방식으로 설정을 하는데 먹히지 않았다.


그전에 잠깐 환경에 따른 설정을 어떻게 하는지 설명이 필요할 거 같다.

내 경우는 환경설정을 위해 spring.profiles.active 를 자주쓰는데 주로 파라미터에 주는 편이다.


-Dspring.profiles.active=dev


그래서 이클립스든 Intellij 든 사용할때 위와 같은 환경을 설정한 후 실행한다.


spring.profiles 에 설정을 기반으로 하여 logback 설정파일을 읽는것이 가장 좋겠다 판단했기에 인터넷에 찾아봤는데 된다고 하는 파일명-[환경설정].xml 방식은 되지 않았다.


이유를 살펴보니 그같은 방식은 springboot 에서만 지원한다고....

내가 사용하는 환경은 Spring 4.x 이기 때문에 사용이 불가한 방법이었다.

(이것도 3.x 에서 업그레이드 했다)


그렇다고해서 매번 배포때마다 주석하거나 파일명을 바꿀순 없었다. 

그래서 찾은것이 condition 이란 명령어였다.


logback.xml 에서 condition 명령어를 쓰려면 다음을 반드시 포함해야 한다.

<dependency>

<groupId>org.codehaus.janino</groupId>

<artifactId>janino</artifactId>

<version>3.1.2</version>

</dependency>



사용예를 보면 다음과 같다


logback.xml


<!-- prod 가 있을때는 logback-prod.xml 참조, 그 외에는 logback-dev.xml 참조-->

<if condition='"${spring.profiles.active}".contains("prod")'>

<then>

<property name="SPRING_PROFILES_ACTION" value="prod" />

</then>

<else>

<property name="SPRING_PROFILES_ACTION" value="dev" />

</else>

</if>


<!--<include resource="logback-${spring.profiles.active}.xml"/>-->

<include resource="logback-${SPRING_PROFILES_ACTION}.xml"/>


3.x의 경우는 spring.profiles 를 먹여도 처음 build 할땐 해당값을 적용하지 못하는 문제가 있었다. 즉 spring.profiles.active=dev 라고 하더라도 위의 파일에서는 dev라는 설정값이 적용되지 않았다.


이쯤에서 logback 파일을 읽는 순서를 한번 점검해도 좋을거 같다.


처음에 실행할 땐 logback.xml 을 가장먼저 읽는다.(springboot도 마찬가지)

logback-[xxx].xml 은 그 후에 읽으므로 모든서버에 로그전략을 동일하게 할거라면 logback.xml 에만 설정하면 된다. 

나처럼 서버 환경에 따라 다른 전략을 쓰려는 사람에게만 유용하다.



아무튼 위의 코드를 보면 ${}를 이용해 변수로 이용했고, contains 를 이용해 비교했다.

여기서 == 같은 부등호는 안먹히니 꼭 contains를 써주면 좋겠다.


두번째로, <then></then>, <else></else>이다. xml을 빌드할 땐 특별한 문법적 문제가 없으면 <then>이 없어도 그냥 넘어가버린다. 그래서 디버깅하는게 여간 까다롭다. 처음에는 이게 작동을 안하는줄 알고 정말 한참을 찾았는데 <then>이 없어서 그랬던것....


마지막줄을 보면 logback-${spring.profiles.active}.xml 을 쓰는것보단 조건에 맞으면 SPRING_PROFILES_ACTION 에 값을 넣고 그것을 활용하는 방법을 썼다. 이것도 초반엔 잘 먹히지 않아 일부로 이렇게 했다.


...

<property name="SPRING_PROFILES_ACTION" value="prod" />

...


<include resource="logback-${SPRING_PROFILES_ACTION}.xml"/>


지금은 환경에 따라 로그파일을 설정에 맞게 호출한다.


끝.

반응형

댓글