Domanda spring boot, logback e logging.config


Sto implementando la registrazione in un progetto di avvio di primavera con la libreria di logback. Voglio caricare diversi file di configurazione di registrazione in base ai miei profili primaverili (proprietà 'spring.pofiles.active'). Ho 3 file: logback-dev.xml, logback-inte.xml e logback-prod.xml. Sto usando la versione di avvio primavera 1.2.2.RELEASE.

Come puoi leggere nella documentazione di avvio di primavera (Qui). Dice:

I vari sistemi di registrazione possono essere attivati ​​includendo le librerie appropriate sul classpath e ulteriormente personalizzati fornendo un file di configurazione adatto nella radice del classpath o in una posizione specificata dalla proprietà Spring Environment. logging.config. (Si noti tuttavia che poiché la registrazione viene inizializzata prima della creazione di ApplicationContext, non è possibile controllare la registrazione da @PropertySources nei file Spring @Configuration. Le proprietà di sistema ei file di configurazione esterni di Spring Boot convenzionali funzionano correttamente).

Così ho provato a impostare la proprietà 'logging.config' nel mio file application.properties:

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

Ma quando avvio la mia applicazione, il mio logback- {profile} .xml non è caricato ...

Penso che il logging sia un problema comune a tutti i progetti che utilizzano l'avvio a molla. Voglio sapere se sono nella giusta direzione o no perché ho altre soluzioni che funzionano anch'io ma non le trovo eleganti (analisi condizionale con Janino nel file logback.xml o nella proprietà della riga di comando).


44
2018-04-03 08:52


origine


risposte:


Ho trovato una soluzione e ho capito perché spring non si preoccupa della mia proprietà 'logging.config' definita nel file application.properties.

Soluzione e spiegazione: 

Quando si inizializza la registrazione, l'avvio a molla cerca solo in classpath o variabili di ambiente (vedi http://docs.spring.io/spring-boot/docs/0.5.0.M3/api/org/springframework/boot/context/initializer/LoggingApplicationContextInitializer.html).

La soluzione migliore che ho trovato è quella di includere un file di logback.xml genitore che includa il file di configurazione di registrazione corretto in base al mio profilo di primavera.

logback.xml: 

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

logback- [profilo] .xml (in questo caso, 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>

Nota :  'spring.profiles.active' deve essere impostato negli argomenti della riga di comando all'avvio dell'app. E.G per proprietà JVM: -Dspring.profiles.active=dev

Documenti di riferimento: 

Modifica (più profili attivi) : Per evitare più file, potremmo usare l'elaborazione condizionale che richiede la dipendenza Janino (configurazione qui), vedi documentazione condizionale. Con questo metodo, possiamo anche controllare più profili attivi contemporaneamente. E.G (Non ho testato questa soluzione, ho inserito un commento se non funziona):

<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>

Vedi javasenior answer per un altro esempio di elaborazione condizionale.


57
2018-04-03 10:05



Un altro approccio che può gestire più profili è creare un file di proprietà separato per ogni ambiente.

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

Essere consapevoli

Se non si presta attenzione si potrebbe finire loggando da qualche parte inaspettato

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

22
2017-07-25 21:24



Invece di aggiungere xmls di logback separati per ogni profilo o avere la condizione IF, suggerirei quanto segue (Se hai meno differenza negli xmls ') per un'elaborazione condizionale facile:

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

9
2018-06-02 16:13



L'elaborazione condizionale con logback sarà una soluzione senza molti file di logback. Qui è un collegamento e una configurazione di logback di esempio con i profili a molla.

<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>

Inoltre, potresti dover aggiungere questo al tuo pom.xml

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

4
2018-03-09 08:41



Spring ha il supporto del prossimo tag <springProperty/> all'interno del file XML di logback, questo tag descritto Qui . Significa che puoi facilmente aggiungere una variabile dal file delle proprietà di Spring, anche questo valore di variabile viene risolto dalla variabile ambiente / sistema per primavera.


3
2018-03-02 13:27