El archivo log4j2.properties no puede leer variables del entorno de Docker o de Kubernetes.
En Spring Boot 2.6.0 usando Log4J2, quiero usar variables de entorno externas en log4j.propeties, pero siempre está tomando el archivo local ‘application.propeties’ en lugar de las variables de entorno reales de Docker o Kubernetes.
Archivo ‘application.properties’
spring.application.name=myapp
Directorio del archivo de registro
log.file.path=logs/dev/mi-app
Archivo de Docker Composer
version: "3"
services:
spring-app-log4j2:
build: ./log4j2
ports:
- "8080:80"
environment:
- SERVER_PORT=80
- LOG_FILE_PATH=logs/prod/mi-app
Archivo ‘log4j2.properties’
name=config
Obtener valores de propiedades de 'application.properties'
property.filename = ${bundle:application:log.file.path}
property.layoutPattern = %d{MMM dd yyyy HH:mm:ss.SSS z} | ${hostName} | %-5p | %c{1}:%L | %M() - %m%n
Adaptadores=consola, rolling
Registrar en consola
appender.console.type=Consola
appender.console.name=STDOUT
appender.console.layout.type=PatternLayout
appender.console.layout.pattern=${layoutPattern}
Registrar en archivo y rueda diaria
appender.rolling.type = RollingFile
appender.rolling.name = roll
appender.rolling.fileName = ${filename}.log
appender.rolling.filePattern = ${filename}.%d{dd-MMM-yyyy}.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = ${layoutPattern}
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 2
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=100MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 5
Registradores = rolling
logger.rolling.name = org.apache.logging.log4j.core.appender.rolling
logger.rolling.level = info
logger.rolling.additivity = true
logger.rolling.appenderRefs = rolling
logger.rolling.appenderRef.rolling.ref = roll
rootLogger.level=info
rootLogger.appenderRefs=stdout,rolling
rootLogger.appenderRef.stdout.ref=STDOUT
rootLogger.appenderRef.rolling.ref = roll
Intentos de salida
property.filename = ${bundle:application:logpath} # Salida - logs/dev/app (tomando valores solo de las propiedades de la aplicación, no de las variables de entorno de pod de Docker)
property.filename = ${sys:logpath} # Salida - ${sys:logpath}
property.filename = ${env:logpath} # No funciona # Salida - ${env:logpath}
#use filename variable
appender.rolling.fileName = ${filename}.log
Cuando se imprime dentro del código Java
```java
@Value("${logpath}") String logpath; # Salida - logs/prod/app
Problema: Cuando se inicia Log4j, no encuentra la ruta del archivo del entorno, por lo que está leyendo el archivo por defecto de ‘application.propeties’.
¿Cómo puedo leer del entorno de Docker o del entorno de Kubernetes?
Quiero que el archivo de registro sea ‘logs/prod/mi-app’ en lugar de ‘logs/dev/mi-app’.
Código fuente: https://github.com/jeebendu/log4j2
davy.ai
Para leer variables de entorno de Docker o Kubernetes en Spring Boot con Log4j2, puedes utilizar el siguiente enfoque:
application.properties
.log4j2.properties
, usar el prefijo de propiedadsys
para hacer referencia a las variables de entorno.Al utilizar el prefijo
sys
, Log4j2 leerá las variables de entorno desde las propiedades del sistema de Java. Y al establecerlog.file.path
en el archivoapplication.properties
, puedes anular el valor predeterminado y utilizar la variable de entorno.Ten en cuenta que también puedes usar el prefijo de propiedad
env
para hacer referencia a las variables de entorno directamente, pero esto puede no funcionar en todos los casos. Si el prefijosys
no funciona para ti, puedes probar el prefijoenv
.