Définir le niveau de journalisation dans Spring Boot via la Variable D'environnement
Devrait-il être possible de définir des niveaux de journalisation via des variables d'environnement seules dans une application de démarrage Spring?
Je ne veux pas utiliser application.properties
car je suis en cours D'exécution sur Cloud Foundry et je veux récupérer des modifications sans déploiement (mais après le redémarrage de l'application ou le redémarrage pour être plus précis).
J'ai essayé de définir des variables env comme LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=TRACE
mais cela n'a aucun effet. Mettre logging.level.org.springframework: TRACE
dans application.properties
fonctionne bien.
7 réponses
C'est juste une idée, mais avez - vous essayé de définir
_JAVA_OPTIONS=-Dlogging.level.org.springframework=TRACE
?
Théoriquement, de cette façon {[1] } sera passé comme argument JVM par défaut et devrait affecter chaque instance JVM de votre environnement.
J'ai également essayé de définir le niveau de journalisation via une variable d'environnement mais comme déjà mentionné, ce n'est pas possible en utilisant une variable d'environnement avec un nom en majuscules, par exemple. LOGGING_LEVEL_ORG_SPRINGFRAMEWORK=DEBUG
. Je ne voulais pas non plus le faire via application.properties
ou _JAVA_OPTIONS
.
Après avoir creusé dans la classe org.springframework.boot.logging.LoggingApplicationListener
j'ai vérifié que spring boot essaie de définir le niveau de journalisation DEBUG
sur ORG_SPRINGFRAMEWORK
package qui n'est pas un vrai nom de paquet. Donc, conclusion, c'est que vous pouvez utiliser la variable d'environnement pour définir le niveau de journalisation, mais il doit être dans le forme:
LOGGING_LEVEL_org.springframework=DEBUG
ou
logging.level.org.springframework=DEBUG
Testé sur le démarrage à ressort 1.5.3
Oui, vous pouvez contrôler le niveau de journalisation à l'aide de la variable d'environnement. Voici comment j'ai implémenté pour mon application Spring Boot, déployée sur la plate-forme Cloud Foundry.
Dans votre fichier de configuration de journal, fournissez un espace réservé pour que le niveau de journalisation lise la valeur de la variable d'environnement. La valeur par défaut est INFO.
<logger name="com.mycompany.apps.cf" level="${APP_LOGGING_LEVEL:-INFO}">
<appender-ref ref="CONSOLE"/>
</logger>
Et puis, dans le fichier manifeste de déploiement CF fournir une variable d'environnement.
applications: - name: my-app-name memory: 2048 env: APP_LOGGING_LEVEL: DEBUG
J'espère que cela vous aidera.
Je vous suggère de toute façon d'utiliser des profils de printemps:
-
Créer 2 fichiers de propriétés:
application-local.properties
etapplication-remote.properties
(les noms de profil peuvent être différents évidemment)
Définir le niveau d'enregistrement de chaque fichier en conséquence (
logging.level.org.springframework
)Exécutez votre application avec
-Dspring.profiles.active=local
localement et-Dspring.profiles.active=remote
pour CF.
Les gens peuvent-ils expliquer pourquoi cela ne fonctionne pas?
$ export LOGGING_LEVEL_COM_ACME = erreur
Pour toutes les autres configurations, l'utilisation de variables d'environnement comme remplacement semble fonctionner sans problème, par exemple:
$ export EUREKA_CLIENT_ENABLED=false
Merci.
En utilisant également Spring Boot (v1.2. 3) dans Cloud Foundry, j'ai trouvé qu'il est possible d'ajuster le niveau de journalisation racine en utilisant une variable d'environnement comme suit:
$ cf set-env <app name> LOGGING_LEVEL_ROOT DEBUG
Malheureusement, il ne semble pas possible de réduire le niveau de journalisation pour des paquets spécifiques (au moins avec la version de Java Buildpack et Spring Boot que j'utilise). Par exemple, l'ajout de ce qui suit en plus de ce qui précède ne réduit pas le niveau de journal pour Spring framework:
$ cf set-env <app name> LOGGING_LEVEL_ORG_SPRINGFRAMEWORK INFO
Si vous êtes en utilisant quelque chose comme Splunk pour rassembler vos journaux, vous pourrez peut-être filtrer le bruit, cependant.
Une autre alternative qui semble prometteuse pourrait être basée sur la personnalisation de l'option arguments du pack de construction (Voir ici):
$ cf set-env <app name> '{arguments: "-logging.level.root=DEBUG -logging.level.org.springframework=INFO"}'
Malheureusement, je ne pouvais pas faire en sorte que cela fonctionne réellement. Je suis certainement d'accord que pouvoir reconfigurer les niveaux de journalisation au niveau du paquet sans changer le code de l'application serait pratique pour travailler.
Voici un exemple utilisant Logback avec Janino pour inclure conditionnellement différentes configurations de journalisation via Propriétés ou variables d'environnement ... La configuration de base, logback.xml utilise des conditions pour la journalisation de la console de développement ou la journalisation des fichiers de production... déposez simplement les fichiers suivants dans /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>