it-swarm.com.de

spring Boot-, Logback- und Logging.config-Eigenschaft

Ich implementiere das Logging in einem Spring Boot-Projekt mit Logback-Bibliothek. Ich möchte verschiedene Protokollierungskonfigurationsdateien gemäß meinen Federprofilen laden (Eigenschaft 'spring.pofiles.active'). Ich habe 3 Dateien: logback-dev.xml, logback-inte.xml und logback-prod.xml. Ich benutze Spring Boot Version 1.2.2.RELEASE. 

Wie Sie in der Springboot-Dokumentation nachlesen können ( hier ). Es sagt:

Die verschiedenen Protokollierungssysteme können aktiviert werden, indem die entsprechenden Bibliotheken in den Klassenpfad eingefügt werden. Darüber hinaus können Sie eine geeignete Konfigurationsdatei im Stamm des Klassenpfads oder an einem durch die Spring Environment-Eigenschaft angegebenen Speicherort bereitstellen logging.config. (Da die Protokollierung jedoch vor der Erstellung des ApplicationContext initialisiert wird, ist es nicht möglich, die Protokollierung von @PropertySources in Spring @Configuration-Dateien zu steuern. Die Systemeigenschaften und die herkömmlichen externen Spring Boot-Konfigurationsdateien funktionieren problemlos.)

Also habe ich versucht, die Eigenschaft 'logging.config' in meiner Datei application.properties festzulegen: 

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

Aber wenn ich meine Anwendung starte, wird mein Logback- {Profil} .xml nicht geladen ... 

Ich denke, das Protokollieren ist ein häufiges Problem, das bei allen Projekten, die Spring Boot verwenden, aufgetreten ist. Ich möchte wissen, ob ich in die richtige Richtung gehe oder nicht, weil ich andere Lösungen habe, die ebenfalls funktionieren, aber ich finde sie nicht elegant (bedingtes Parsen mit Janino in der Datei logback.xml oder in der Befehlszeileneigenschaft).

47
LG_

Ich habe eine Lösung gefunden und verstanden, warum sich Spring nicht um meine in der Datei application.properties definierte Eigenschaft 'logging.config' kümmert.

Lösung und Erklärung: 

Beim Initialisieren der Protokollierung sucht Spring Boot nur in Klassenpfad- oder Umgebungsvariablen (siehe http://docs.spring.io/spring-boot/docs/0.5.0.M3/api/org/springframework/boot/context/initializer) /LoggingApplicationContextInitializer.html ). 

Die beste Lösung, die ich gefunden habe, besteht darin, eine übergeordnete Datei logback.xml einzuschließen, die die richtige Protokollierungskonfigurationsdatei gemäß meinem Federprofil enthält.

logback.xml: 

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

logback- [profile] .xml (in diesem Fall 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>

Hinweis: 'Spring.profiles.active' muss beim Starten der App in Befehlszeilenargumenten festgelegt werden. E.G für JVM-Eigenschaften: -Dspring.profiles.active=dev

Referenzdokumente: 

Edit (mehrere aktive Profile): Um mehrere Dateien zu vermeiden, können Sie die bedingte Verarbeitung verwenden, für die eine Janino-Abhängigkeit erforderlich ist ( hier einrichten ), siehe bedingte Dokumentation . Mit dieser Methode können wir auch nach mehreren aktiven Profilen gleichzeitig suchen. E.G (Ich habe diese Lösung nicht getestet, füge einen Kommentar ein, wenn sie nicht funktioniert): 

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

In der Antwort von Javasenior finden Sie ein weiteres Beispiel für die bedingte Verarbeitung.

63
LG_

Ein anderer Ansatz, der mehrere Profile verarbeiten könnte, besteht darin, für jede Umgebung eine separate Eigenschaftsdatei zu erstellen.

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

SEI VORSICHTIG

Wenn Sie nicht vorsichtig sind, können Sie sich irgendwo unerwartet anmelden

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

Anstatt separate Logback-XML-Dateien für jedes Profil hinzuzufügen oder die IF-Bedingung zu verwenden, würde ich Folgendes vorschlagen (wenn Sie weniger Unterschiede in den XML-Dateien haben), um die bedingte Verarbeitung zu erleichtern: 

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

Die bedingte Verarbeitung mit Logback ist eine Lösung ohne viele Logback-Dateien. Hier ist ein Link und eine Muster-Logback-Konfiguration mit Federprofilen.

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

Möglicherweise müssen Sie dies auch Ihrer pom.xml hinzufügen

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

Spring unterstützt das nächste Tag <springProperty/> in der Logback-XML-Datei. Dieses Tag beschreibt hier . Das bedeutet, dass Sie leicht Variablen aus der Spring-Eigenschaftendatei hinzufügen können, selbst wenn dieser Variablenwert von der Umgebungs-/Systemvariablen durch Spring aufgelöst wird.

3
Andriy Rymar

Sie können verschiedene logback.xml für verschiedene Profile festlegen, nur 3 Schritte:

1, Aktiviertes Profil in application.properties oder application.yml angeben:

spring.profiles.active: test

2, Config Logback, um unterschiedliche Konfigurationen nach Profil einzuschließen:

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

3, Konfigurationsdatei erstellen logback.test.xml:

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

Es ist sehr einfach, brauche nichts anderes zu tun.

0
sulin