es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para leer variables de entorno de Docker o Kubernetes en Spring Boot con Log4j2, puedes utilizar el siguiente enfoque:

    1. Definir las variables de entorno en el archivo de configuración de Docker o Kubernetes.
    version: "3"
    
    services:
    
      spring-app-log4j2:
        build: ./log4j2
        ports:
          - "8080:80"
        environment:
          - SERVER_PORT=80
          - LOG_FILE_PATH=logs/prod/my-app
    
    1. Usar las variables de entorno en el archivo application.properties.
    log.file.path=${LOG_FILE_PATH}
    
    1. En el archivo log4j2.properties, usar el prefijo de propiedad sys para hacer referencia a las variables de entorno.
    appender.rolling.fileName = ${sys:log.file.path}.log
    

    Al utilizar el prefijo sys, Log4j2 leerá las variables de entorno desde las propiedades del sistema de Java. Y al establecer log.file.path en el archivo application.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 prefijo sys no funciona para ti, puedes probar el prefijo env.

Comments are closed.