Pergunta

É possível variáveis ??de ambiente sistema de referência (em oposição a propriedades do sistema Java) em um arquivo de configuração log4j xml?

Eu gostaria de ser capaz de fazer algo como:

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

e tê-lo começar a partir das variáveis ??de ambiente do sistema, para que eu possa evitar ter que passar em tantas coisas com -d parâmetros.

Foi útil?

Solução

Esta sintaxe é documentada apenas em 2.X log4j isso certifique-se que você está usando a versão correta. Ele não funciona nas versões 1.X.

    <Appenders>
    <File name="file" fileName="${env:LOG_PATH}">
        <PatternLayout>
            <Pattern>%d %p %c{1.} [%t] %m %ex%n</Pattern>
        </PatternLayout>
    </File>
</Appenders>

Outras dicas

Eu tentei fazer isso recentemente e não poderia obtê-lo a trabalhar. O que eu acabei fazendo é enviar uma variável na inicialização. Então, digamos que você tem uma variável de ambiente chamada $ log_level:

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

e na inicialização ...

java -Dlog_level=$LOG_LEVEL your_app

Eu acho que isso não é suportado, mas basicamente você pode fazer duas coisas para trazer em suas variáveis ??de ambiente:

  1. Use System.setProperty antes Log4J fica configurado

  2. Converter (seus) variáveis ??de ambiente para as propriedades do sistema em seu lançador

A primeira opção basicamente se resume a isto:

for (Map<String,String>.Entry entry : System.getenv().entrySet()) {
  System.setProperty(entry.getKey(), entry.getValue());
}

... mas a questão é, naturalmente, onde colocar esse código. Em particular, se você está rodando dentro de algum tipo de recipiente Tomcat ou similar, isso pode ser problemático.

O outro depende muito do seu ambiente. Basicamente, se você tem um shell script que inicia seu aplicativo, você pode escrever alguma mágica shell para definir todas as variáveis ??de ambiente como propriedades, ou apenas o que você precisa, p.ex.:.

java -DMY_ENV=$MY_ENV -DMY_OTHER_ENV=$MY_OTHER_ENV -cp ... com.example.Main

Também é possível alterar os seus scripts de inicialização do servidor para suportar isto, por exemplo catalina.sh ou similar.

Você precisa colocar uma vírgula entre env e o nome da variável, como este:

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

Criar uma variável do sistema. Eu prefiro usar setenv.bat para essas variáveis.

@echo off
rem app specific log dir
set "APP_LOG_ROOTDIR=../app/app-log"
exit /b 0

Adicionar referência no arquivo 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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top