Использование системных переменных среды в конфигурации log4j xml - PullRequest
47 голосов
/ 14 октября 2008

Можно ли ссылаться на системные переменные среды (в отличие от системных свойств Java) в файле конфигурации log4j xml?

Я бы хотел иметь возможность сделать что-то вроде:

<level value="${env.LOG_LEVEL}" />

и получим это из системных переменных среды, поэтому я могу избежать необходимости передавать так много вещей с параметрами -D.

Ответы [ 5 ]

49 голосов
/ 14 октября 2008

Я пытался сделать это недавно и не смог заставить его работать. В итоге я отправил переменную при запуске. Допустим, у вас есть переменная окружения с именем $ LOG_LEVEL:

<level value="${log_level}" />

и при запуске ...

java -Dlog_level=$LOG_LEVEL your_app
21 голосов
/ 29 марта 2015

Этот синтаксис документирован только в 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>
11 голосов
/ 15 октября 2008

Я думаю, что это не поддерживается, но в основном вы можете сделать две вещи, чтобы ввести переменные среды:

  1. Используйте System.setProperty до того, как Log4J будет настроен

  2. Преобразуйте (ваши) переменные окружения в системные свойства вашего средства запуска

Первый вариант сводится к следующему:

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 или аналогичный.

4 голосов
/ 21 февраля 2014

Вам нужно поставить двоеточие между env и именем переменной, например:

<level value="${env:LOG_LEVEL}" />
0 голосов
/ 03 февраля 2016

Создать системную переменную. Я предпочитаю использовать 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>
...