modificar - variables de entorno java linux
Usar las variables de entorno del sistema en la configuraciĆ³n log4j xml (5)
Crea una variable del 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>
¿Es posible hacer referencia a variables de entorno del sistema (a diferencia de las propiedades del sistema Java) en un archivo de configuración log4j xml?
Me gustaría poder hacer algo como:
<level value="${env.LOG_LEVEL}" />
y obtenerlo de las variables de entorno del sistema, por lo que puedo evitar tener que pasar tantas cosas con parámetros -D.
Creo que esto no es compatible, pero básicamente puedes hacer dos cosas para traer tus variables de entorno:
Use System.setProperty antes de que se configure Log4J
Convierta (su) variables de entorno a propiedades del sistema en su iniciador
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 poner este código. En particular, si está ejecutando dentro de algún tipo de contenedor de 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, así:
<level value="${env:LOG_LEVEL}" />
Esta sintaxis está documentada solo en log4j 2.X así que asegúrese de estar utilizando 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>
Intenté hacer eso recientemente y no pude hacerlo funcionar. Lo que terminé haciendo es enviar una variable al inicio. Entonces, supongamos que tiene una variable de entorno llamada $ LOG_LEVEL:
<level value="${log_level}" />
y al inicio ...
java -Dlog_level=$LOG_LEVEL your_app