2008-10-14 2 views
40

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

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

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

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

+0

Я просто прокомментировал наиболее upvoted ответ и объяснил мои рассуждения. Я также только что поддержал ответ, который я принял, за то, что он стоит. – 2015-09-30 20:46:59

ответ

12

Этот синтаксис задокументированы только в 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> 
46

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

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

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

java -Dlog_level=$LOG_LEVEL your_app 
+0

Я специально спросил, как это сделать * без * необходимости устанавливать их как параметры -D, поэтому это не отвечает на мой вопрос вообще. – 2015-09-30 20:46:18

11

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

  1. Использование System.setProperty перед тем Log4J получает сконфигурированные

  2. Convert (ваши) переменные окружения в свойствах системы в вашей пусковой

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

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 

Также возможно изменить ваш запуск сервера для поддержки этого, например каталины.sh или аналогичные.

2

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

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

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

Синтаксис, который вы там показываете, $ {APP_LOG_ROOTDIR} рассматривает переменные системной среды, а не только свойства системы Java? Мое понимание (и опыт) заключалось в том, что он рассматривает только свойства системы Java, а не переменные среды. – 2016-02-04 00:43:51