본문 바로가기
Java

log4j의 logback.xml에 로그 저장경로를 os별로 다르게 하고 싶을 때(janino)

by 루에 2020. 1. 30.
반응형

log4j는 기본적으로 실행 패키지 안에 logback.xml 파일을 읽게 되어있다.

자동으로 읽기 때문에 크로스 플랫폼을 지원하는 애플리케이션의 경우 해당 파일에 경로를 os별로 구분해야 했다.

처음 아이디어는 build.gradle에 설정을 추가하여 os별로 xml파일을 구분하여 복사하고 빌드하는 것이었는데... 별로 좋지 않은 것 같아 logback.xml에 설정할 수 있는 방법이 있는지 찾아보았다.

 

janino plugin

log4j에만 해당되는지는 모르겠으나, xml에 if condition문을 사용할 수 있게 하는 플러그인을 찾았다.

설정은 아래 링크를 참조

https://mvnrepository.com/artifact/org.codehaus.janino/janino

 

Maven Repository: org.codehaus.janino » janino

The "JANINO" implementation of the "commons-compiler" API: Super-small, super-fast, independent from the JDK's "tools.jar". VersionRepositoryUsagesDate3.1.x3.1.0Central18Aug, 20193.0.x3.0.15Central2Jul, 20193.0.14Central3Jul, 20193.0.13Central1Jun, 20193.0

mvnrepository.com

설정한 뒤 os를 구분하기 위한 함수 중 적용되는 것이 무엇인지 찾아보았다. SystemUtils의 IS_OS_LINUX 등의 함수가 가장 적절하나 적용되지 않았다. System의 getProperty("os.name") 및 contains(), equals() 등은 사용 가능한 것을 확인하였고 어쩔 수 없이 if 분기로 적용하는 것으로 하였다.

 

<if condition="System.getProperty('os.name').equals('linux')">

그런데 왠걸. 동작하지 않았다. 에러를 뿜뿜 내뱉는다.

이유를 찾아보니 따옴표의 문제였다. 함수 내의 문자열 파라미터를 큰따옴표로 감싸야했다. 자연스럽게 구문을 감싸는 따옴표는 작은 따옴표가 되었다.

 

<if condition='System.getProperty("os.name").toLowerCase().contains("linux")'>

정상 작동함을 확인하였고 최종적으로 아래와 같이 적용하였다.

 

<if condition='System.getProperty("os.name").toLowerCase().contains("linux")'>
        <then>
            <property name="LOGS_ABSOLUTE_PATH" value="../../Common/Logs/AppLog"/>  <!-- 리눅스일 경우 로그 경로 -->
        </then>
        <else>
            <property name="LOGS_ABSOLUTE_PATH" value="./logs"/>    <!-- 그 외 os의 로그 경로 -->
        </else>
    </if>

 

끗!

반응형

댓글