variable modificar java_home entorno crear configurar java spring spring-boot

modificar - variables de entorno java linux



Establecer el nivel de registro en Spring Boot a través de la variable de entorno (7)

¿Alguien puede explicar por qué esto no funciona?

$ export LOGGING_LEVEL_COM_ACME = ERROR

Para todas las otras configuraciones que usan variables de entorno, una anulación parece funcionar sin problemas, por ejemplo:

$ export EUREKA_CLIENT_ENABLED = falso

Gracias.

¿Debería ser posible establecer niveles de registro solo mediante variables de entorno en una aplicación Spring Boot?

No quiero usar application.properties porque estoy ejecutando en Cloud Foundry y quiero recoger cambios sin una implementación (pero después de que la aplicación se haya reiniciado o reestablecido para ser más preciso).

Intenté establecer env LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=TRACE como LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=TRACE pero eso no tiene ningún efecto. Sin logging.level.org.springframework: TRACE poner logging.level.org.springframework: TRACE en application.properties sí funciona.


Aquí hay un ejemplo que usa Logback con Janino para incluir condicionalmente diferentes configuraciones de registro a través de propiedades o variables ambientales ... La configuración base, logback.xml está usando condicionales para el registro de la consola de desarrollo o el registro de archivos de producción ... simplemente suelte los siguientes archivos en /resources/

logback.xml

<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true"> <if condition=''property("spring.profiles.active").contains("dev")''> <then> <include resource="org/springframework/boot/logging/logback/base.xml"/> <include resource="dev.xml" optional="true"/> </then> </if> <if condition=''property("spring.profiles.active").contains("pro")''> <then> <include resource="org/springframework/boot/logging/logback/base.xml"/> <include resource="pro.xml" optional="true"/> </then> </if> </configuration>

dev.xml

<included> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <charset>utf-8</charset> <Pattern>%-30([%p] [%c:%L]) » %m%n%rEx</Pattern> </encoder> </appender> <!-- CHATTY LOGGERS HERE.--> <logger name="org.springframework" level="DEBUG"/> <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> <resetJUL>true</resetJUL> </contextListener> <root level="${logback.loglevel}"> <appender-ref ref="CONSOLE"/> </root> </included>

pro.xml

<included> <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:- } --- [%t] %-40.40logger{39} : %m%n%wex"/> <property name="FILE_NAME_PATTERN" value="./logs/%d{yyyy-MM-dd}-exec.log"/> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>FILE_NAME_PATTERN</fileNamePattern> <maxHistory>7</maxHistory> </rollingPolicy> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> </encoder> </appender> <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <queueSize>512</queueSize> <appender-ref ref="FILE"/> </appender> <!-- APP SPECIFIC LOGGERS HERE.--> <logger name="org.springframework.boot.SpringApplication" level="INFO"/> <root level="INFO"> <appender-ref ref="FILE"/> </root> </included>


De todos modos, te sugiero que uses los perfiles de Spring:

  1. Crea 2 archivos de propiedades:

    application-local.properties y application-remote.properties

    (Los nombres de perfil pueden ser diferentes obviamente)

  2. Establezca el nivel de registro en cada archivo en consecuencia ( logging.level.org.springframework )

  3. Ejecute su aplicación con -Dspring.profiles.active=local localmente y -Dspring.profiles.active=remote para CF.


Esto es solo una idea, pero ¿trataste de establecer

_JAVA_OPTIONS=-Dlogging.level.org.springframework=TRACE ¿ _JAVA_OPTIONS=-Dlogging.level.org.springframework=TRACE ?

En teoría, de esta manera -Dlogging.level.org.springframework=TRACE pasará como argumento JVM predeterminado y debería afectar a cada instancia de JVM en su entorno.


Sí, puedes controlar el nivel de registro usando la variable de entorno. Aquí es cómo lo he implementado para mi aplicación Spring Boot, desplegada en la plataforma Cloud Foundry.

En su archivo de configuración de registro, proporcione marcador de posición para el nivel de registro para leer el valor de la variable de entorno. El valor predeterminado es INFO.

<logger name="com.mycompany.apps.cf" level="${APP_LOGGING_LEVEL:-INFO}"> <appender-ref ref="CONSOLE"/> </logger>

Y luego, en el archivo de manifiesto de despliegue de CF proporciona una variable de entorno.

applications: - name: my-app-name memory: 2048 env: APP_LOGGING_LEVEL: DEBUG

Espero que esto sea de ayuda.


También traté de establecer el nivel de registro a través de la variable de entorno, pero como ya se mencionó, no es posible usar una variable de entorno con mayúscula, por ej. LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=DEBUG . Tampoco quería hacerlo a través de application.properties o _JAVA_OPTIONS .

Después de excavar en la clase org.springframework.boot.logging.LoggingApplicationListener , he comprobado que el arranque de primavera intenta establecer el nivel de registro DEBUG en el paquete ORG_SPRINGFRAMEWORK , que no es el nombre real del paquete. Entonces, la conclusión es que puede usar la variable de entorno para establecer el nivel de registro, pero debe tener el formato: LOGGING_LEVEL_org.springframework=DEBUG o logging.level.org.springframework=DEBUG

Probado en arranque de primavera 1.5.3


También usando Spring Boot (v1.2.3) en Cloud Foundry, he descubierto que es posible ajustar el nivel de registro de raíz usando una variable de entorno de la siguiente manera:

$ cf set-env <app name> LOGGING_LEVEL_ROOT DEBUG

Desafortunadamente, no parece posible reducir el nivel de registro para paquetes específicos (al menos con la versión de Java Buildpack y Spring Boot que estoy usando). Por ejemplo, agregar lo siguiente además de lo anterior no reduce el nivel de registro para Spring framework:

$ cf set-env <app name> LOGGING_LEVEL_ORG_SPRINGFRAMEWORK INFO

Sin embargo, si está utilizando algo como Splunk para recopilar sus registros, es posible que pueda filtrar el ruido.

Otra alternativa que parece prometedora podría basarse en la personalización de la opción de argumentos del paquete de compilación (ver here ):

$ cf set-env <app name> ''{arguments: "-logging.level.root=DEBUG -logging.level.org.springframework=INFO"}''

Tristemente, no pude hacer que esto realmente funcionara. Ciertamente estoy de acuerdo en que ser capaz de reconfigurar los niveles de registro a nivel de paquete sin cambiar el código de la aplicación sería útil para trabajar.