Pregunta

¿Es posible hacer referencia a las variables de entorno del sistema (a diferencia de las propiedades del sistema Java) en un archivo de configuración xml log4j?

Me gustaría poder hacer algo como:

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

y haga que obtenga eso de las variables de entorno del sistema, así puedo evitar tener que pasar tantas cosas con los parámetros -D.

¿Fue útil?

Solución

Esta sintaxis está documentada solo en log4j 2.X, así que asegúrese de estar usando la versión correcta. No funciona en las versiones 1.X.

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

Otros consejos

Intenté hacer eso recientemente y no pude hacerlo funcionar. Lo que terminé haciendo es enviar una variable al inicio. Digamos que tienes una variable de entorno llamada $ LOG_LEVEL:

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

y al inicio ...

java -Dlog_level=$LOG_LEVEL your_app

Creo que esto no es compatible, pero básicamente puedes hacer dos cosas para incorporar las variables de tu entorno:

  1. Use System.setProperty antes de que Log4J se configure

  2. Convierta (sus) variables de entorno en propiedades del sistema en su lanzador

La primera opción básicamente se reduce a esto:

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

... pero la pregunta es, por supuesto, dónde colocar este código. En particular, si está ejecutando dentro de algún tipo de contenedor Tomcat o similar, esto podría ser problemático.

El otro depende en gran medida de su entorno. Básicamente, si tiene un script de shell que inicia su aplicación, puede escribir algo de magia de shell para establecer todas las variables de entorno como propiedades, o solo las que necesita, por ejemplo:

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

También es posible modificar las secuencias de comandos de inicio del servidor para admitir esto, por ejemplo. catalina.sh o similar.

Debes poner dos puntos entre env y el nombre de la variable, como esto:

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

Crea una variable de sistema. Prefiero usar setenv.bat para tales variables.

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

Agregar referencia en el archivo 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top