Использование переменных системной среды в конфигурации log4j xml
-
03-07-2019 - |
Вопрос
Можно ли ссылаться на переменные системной среды (в отличие от системных свойств Java) в файле конфигурации xml log4j?
Я хотел бы иметь возможность сделать что-то вроде:
<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
Я думаю, что это не поддерживается, но по сути вы можете сделать две вещи, чтобы добавить переменные среды:
Используйте System.setProperty до настройки Log4J.
Преобразуйте (ваши) переменные среды в системные свойства в панели запуска.
Первый вариант в основном сводится к следующему:
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 или аналогичный.
Вам нужно поставить двоеточие между env и именем переменной, например:
<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>