web-dev-qa-db-fra.com

propriété de démarrage, de consignation et de journalisation.config

Je suis implémenter la journalisation dans un projet de démarrage de printemps avec la bibliothèque de journal. Je souhaite charger différents fichiers de configuration de journalisation en fonction de mes profils de ressort (propriété 'spring.pofiles.active'). J'ai 3 fichiers: logback-dev.xml, logback-inte.xml et logback-prod.xml. J'utilise la version de démarrage de printemps 1.2.2.RELEASE. 

Comme vous pouvez le lire dans la documentation de démarrage printanière ( ici ). Ça dit:

Les différents systèmes de journalisation peuvent être activés en incluant les bibliothèques appropriées sur le chemin de classe, puis personnalisés en fournissant un fichier de configuration approprié à la racine du chemin de classe ou à un emplacement spécifié par la propriété Spring Environment. logging.config. (Notez toutefois que, comme la journalisation est initialisée avant la création du champ ApplicationContext, il est impossible de contrôler la journalisation à partir de @PropertySources dans les fichiers Spring @Configuration. Les propriétés système et les fichiers de configuration externes classiques Spring Boot fonctionnent parfaitement.)

J'ai donc essayé de définir la propriété 'logging.config' dans mon fichier application.properties: 

logging.config=classpath:/logback-${spring.profiles.active}.xml

Mais lorsque je lance mon application, mon journal de bord- {profil} .xml n'est pas chargé ... 

Je pense que la journalisation est un problème courant rencontré par tous les projets utilisant Spring Boot. Je veux savoir si je suis dans la bonne direction ou non car j'ai d'autres solutions qui fonctionnent aussi mais je ne les trouve pas élégantes (analyse conditionnelle avec Janino dans le fichier logback.xml ou la propriété en ligne de commande).

47
LG_

J'ai trouvé une solution et j'ai compris pourquoi spring ne prenait pas soin de ma propriété 'logging.config' définie dans le fichier application.properties.

Solution et explication: 

Lors de l’initialisation de la journalisation, Spring Boot n’examine que les variables classpath ou environment (voir http://docs.spring.io/spring-boot/docs/0.5.0.M3/api/org/springframework/boot/context/initializer /LoggingApplicationContextInitializer.html ). 

La meilleure solution que j'ai trouvée consiste à inclure un fichier parent logback.xml qui inclura le fichier de configuration de journalisation approprié en fonction de mon profil Spring.

logback.xml: 

<configuration>
    <include resource="logback-${spring.profiles.active}.xml"/>
</configuration>

logback- [profil] .xml (dans ce cas, logback-dev.xml):

<included>

    <!-- put your appenders -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
     ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
       <encoder>
           <pattern>%d{ISO8601} %p %t %c{0}.%M - %m%n</pattern>
           <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- put your loggers here -->
    <logger name="org.springframework.web" additivity="false" level="INFO">
        <appender-ref ref="CONSOLE" />
    </logger>

    <!-- put your root here -->
    <root level="warn">
        <appender-ref ref="CONSOLE" />
    </root>

</included>

Remarque: 'Spring.profiles.active' doit être défini dans les arguments de la ligne de commande lors du démarrage de l'application. E.G pour les propriétés de la machine virtuelle Java: -Dspring.profiles.active=dev

Documents de référence: 

Edit (plusieurs profils actifs): Afin d'éviter plusieurs fichiers, nous pourrions utiliser un traitement conditionnel nécessitant une dépendance de Janino ( setup here ), voir documentation conditionnelle . Avec cette méthode, nous pouvons également vérifier plusieurs profils actifs en même temps. E.G (je n'ai pas testé cette solution, mettez un commentaire si cela ne fonctionne pas): 

<configuration>

    <if condition='"${spring.profiles.active}".contains("profile1")'>
        <then>
         <!-- do whatever you want for profile1 -->
        </then>
    </if>

    <if condition='"${spring.profiles.active}".contains("profile2")'>
        <then>
         <!-- do whatever you want for profile2 -->
        </then>
    </if>

    <!-- common config -->

</configuration>

Voir la réponse javasenior pour un autre exemple de traitement conditionnel.

63
LG_

Une autre approche permettant de gérer plusieurs profils consiste à créer un fichier de propriétés distinct pour chaque environnement.

application-prod.properties

logging.config=classpath:logback-prod.xml

application-dev.properties

logging.config=classpath:logback-dev.xml

application-local.properties

logging.config=classpath:logback-local.xml

ÊTRE CONSCIENT

Si vous ne faites pas attention, vous pourriez vous connecter à un endroit inattendu.

-Dspring.profiles.active=local,dev //will use logback-dev.xml
-Dspring.profiles.active=dev,local //will use logback-local.xml
25
Zergleb

Au lieu d’ajouter des xml de consignation distincts pour chaque profil ou d’avoir la condition IF, je suggère ce qui suit (si vous avez moins de différence dans les xml ') pour un traitement conditionnel facile: 

<springProfile name="dev">
<logger name="org.sample" level="DEBUG" />
</springProfile>
<springProfile name="prod">
<logger name="org.sample" level="TRACE" />
</springProfile>
9
nav3916872

Le traitement conditionnel avec logback sera une solution sans beaucoup de fichiers logback. Voici un lien et un exemple de configuration de journal avec des profils de ressort.

<configuration>

    <property name="LOG_LEVEL" value="INFO"/>

        <if condition='"product".equals("${spring.profiles.active}")'>
           <then>
                <property name="LOG_LEVEL" value="INFO"/>
           </then>
           <else>
                <property name="LOG_LEVEL" value="ERROR"/>
           </else>
        </if>

         .
         .
         appender, logger tags etc.
         .
         .

         <root level="${LOG_LEVEL}">
             <appender-ref ref="STDOUT"/>
         </root>

</configuration>

En outre, vous devrez peut-être ajouter ceci à votre pom.xml

<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    <version>3.0.6</version>
</dependency>
4
javasenior

Spring prend en charge la balise suivante <springProperty/> dans le fichier XML Logback, cette balise décrite ici . Cela signifie que vous pouvez facilement ajouter une variable à partir d'un fichier de propriétés Spring, même si cette valeur de variable est résolue à partir d'une variable environnement/système par Spring.

3
Andriy Rymar

Vous pouvez spécifier différents fichiers logback.xml pour différents profils, en 3 étapes seulement:

1, Spécifiez le profil activé dans application.properties ou application.yml:

spring.profiles.active: test

2, la journalisation de configuration pour inclure différentes configurations par profil:

<!DOCTYPE configuration>
<configuration scan="true" scanPeriod="30 seconds">
    <springProperty scope="context" name="profile" source="spring.profiles.active"/>
    <include resource="logback.${profile}.xml"/>
</configuration>

3, Créer le fichier de configuration logback.test.xml:

<?xml version="1.0" encoding="UTF-8"?>
<included>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <root level="INFO"/>
</included>

C'est très simple, vous n'avez rien d'autre à faire.

0
sulin