LOG4J XML 구성에서 시스템 환경 변수 사용
-
03-07-2019 - |
문제
LOG4J XML 구성 파일에서 시스템 환경 변수 (Java 시스템 속성과 반대로)를 참조 할 수 있습니까?
나는 다음과 같은 일을 할 수 있기를 원합니다.
<level value="${env.LOG_LEVEL}" />
시스템 환경 변수에서 얻을 수 있으므로 -D 매개 변수로 많은 것을 전달하지 않아도됩니다.
해결책
이 구문은 log4j 2.x에만 문서화되어 있으므로 올바른 버전을 사용하고 있는지 확인하십시오. 1.x 버전에서는 작동하지 않습니다.
<Appenders>
<File name="file" fileName="${env:LOG_PATH}">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m %ex%n</Pattern>
</PatternLayout>
</File>
</Appenders>
다른 팁
나는 최근에 그렇게하려고 노력했고 그것을 작동시킬 수 없었습니다. 내가 한 일은 시작시 변수를 보내는 것입니다. 따라서 $ log_level이라는 환경 변수가 있다고 가정합니다.
<level value="${log_level}" />
그리고 스타트 업에서 ...
java -Dlog_level=$LOG_LEVEL your_app
나는 이것이 뒷받침되지 않는다고 생각하지만 기본적으로 환경 변수를 가져 오기 위해 두 가지 작업을 수행 할 수 있습니다.
log4j가 구성되기 전에 System.setProperty를 사용하십시오
(귀하의) 환경 변수를 런처의 시스템 속성으로 변환
첫 번째 옵션은 기본적으로 다음과 같습니다.
for (Map<String,String>.Entry entry : System.getenv().entrySet()) {
System.setProperty(entry.getKey(), entry.getValue());
}
... 그러나 질문은 물론이 코드를 어디에 두어야하는지입니다. 특히 Tomcat 컨테이너 또는 이와 유사한 종류의 실행중인 경우 문제가 발생할 수 있습니다.
다른 하나는 주로 환경에 달려 있습니다. 기본적으로 앱을 시작하는 쉘 스크립트가있는 경우 모든 환경 변수를 속성으로 설정하거나 필요한 것과 예를 들어 쉘 매직을 작성할 수 있습니다.
java -DMY_ENV=$MY_ENV -DMY_OTHER_ENV=$MY_OTHER_ENV -cp ... com.example.Main
Catalina.sh 또는 이와 유사한이를 지원하기 위해 서버 시작 스크립트를 변경할 수도 있습니다.
이와 같이 대장을 대장과 변수의 이름 사이에 넣어야합니다.
<level value="${env:LOG_LEVEL}" />
시스템 변수를 만듭니다. 그러한 변수에 setenv.bat를 사용하는 것이 좋습니다.
@echo off
rem app specific log dir
set "APP_LOG_ROOTDIR=../app/app-log"
exit /b 0
log4j.xml 파일에 참조를 추가하십시오
<appender name="fileAppender" class="org.apache.log4j.RollingFileAppender">
<param name="Threshold" value="DEBUG" />
<param name="MaxFileSize" value="512KB" />
<param name="MaxBackupIndex" value="10" />
<param name="File" value="${APP_LOG_ROOTDIR}/app.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p %c{1} %m %n" />
</layout>
</appender>