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.

29
demandé sur EngineerBetter_DJ 2015-12-09 17:19:45

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.

39
répondu Timekiller 2015-12-12 08:05:51

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

9
répondu pepuch 2017-08-28 07:46:45

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.

5
répondu Sparkle8 2015-12-16 16:35:50

Je vous suggère de toute façon d'utiliser des profils de printemps:

  1. Créer 2 fichiers de propriétés:

    application-local.properties et application-remote.properties

    (les noms de profil peuvent être différents évidemment)

  2. Définir le niveau d'enregistrement de chaque fichier en conséquence (logging.level.org.springframework)

  3. Exécutez votre application avec -Dspring.profiles.active=local localement et -Dspring.profiles.active=remote pour CF.

2
répondu Michał Urbaniak 2015-12-15 21:59:24

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.

2
répondu Damian O' Neill 2016-01-08 11:35:13

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.

1
répondu Allan Lang 2016-01-28 10:50:41

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>
0
répondu Eddie B 2015-12-17 13:06:13