2015-04-03 9 views
42

Ich bin implementieren Protokollierung 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 Springboot Version 1.2.2.RELEASE.Spring Boot, Logback und Logging.config Eigenschaft

Wie Sie in Spring Boot-Dokumentation (here) lesen können. Dort heißt es:

Die verschiedenen Erfassungssysteme können, indem die entsprechenden Bibliotheken auf dem Classpath aktiviert werden, und weiter angepasst durch eine geeignete Konfigurationsdatei in der Wurzel des Classpath anbieten oder an einem Ort, von der Frühling Umwelt angegeben Eigenschaft logging.config. (Beachten Sie jedoch, dass die Protokollierung von @PropertySources in Spring @Configuration-Dateien nicht gesteuert werden kann, da die Protokollierung vor der Erstellung von ApplicationContext initialisiert wird. Systemeigenschaften und die konventionellen externen Spring Boot-Konfigurationsdateien funktionieren einwandfrei.)

Also versuchte ich 'logging.config' Eigenschaft in meiner Datei application.properties zu setzen:

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

Aber wenn ich meine Anwendung starten, mein logback- {Profil} .xml nicht geladen ...

Ich denke, Protokollierung ist ein häufiges Problem, das alle Projekte, die Springboots verwenden, sind angetroffen worden. Ich möchte wissen, ob ich in die richtige Richtung bin oder nicht, weil ich andere Lösungen habe, die auch funktionieren, aber ich finde sie nicht elegant (bedingtes Parsing mit Janino in logback.xml-Datei oder Befehlszeilen-Eigenschaft).

+0

Haben Sie eine elegante Lösung gefunden, wenn Sie mehrere aktive Profile gleichzeitig haben? – Gevorg

+0

Überprüfen Sie meine Bearbeitung am 3. März 2016 –

Antwort

54

Ich habe eine Lösung gefunden und ich habe verstanden, warum Spring nicht über meine Eigenschaft 'logging.config' in der application.properties-Datei definiert ist.

Lösung und Erklärung:

Wenn initialize Protokollierung, Feder Boot sieht nur in Classpath oder Umgebungen Variablen (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 fand, ist, eine übergeordnete logback.xml-Datei aufzunehmen, die die richtige Logging-Konfigurationsdatei gemäß meinem Federprofil enthält.

logback.xml:

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

logback- [profil] .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> 

Anmerkung: 'spring.profiles.active' muss beim Starten der App in Kommandozeilenargumenten angegeben werden. E.G für JVM-Eigenschaften: -Dspring.profiles.active=dev

Ref docs:

Edit (mehrere aktive Profile): Um t o Um mehrere Dateien zu vermeiden, könnten wir eine bedingte Verarbeitung verwenden, die eine Janino-Abhängigkeit erfordert (setup here), siehe conditional documentation. Mit dieser Methode können wir auch mehrere aktive Profile gleichzeitig prüfen. Z. B (Ich habe diese Lösung nicht testen, Kommentar setzen, wenn es 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> 

Siehe javasenior Antwort für ein anderes Beispiel für die bedingte Verarbeitung.

+0

Dieser Ansatz scheint für Ihren Anwendungsfall gut, jedoch haben wir möglicherweise mehr als ein Profil in der Umgebung definiert, die dazu führen würde, dass das Include unterbrochen wird. d.h. Federprofile.Aktiv = Profil1, Profil2. mjj1409

+0

Ja, das stimmt. In diesem Fall würde ich Janino-Bibliothek verwenden. –

+0

alle Updates auf eine elegante Lösung für wenn Sie mehrere aktive Profile gleichzeitig haben? – Gevorg

21

Ein anderer Ansatz, der mehrere Profile verarbeiten kann, ist das Erstellen einer separaten Eigenschaftendatei für jede Umgebung.

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 

AWARE BE

Wenn Sie nicht vorsichtig sind Sie

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

Bedingte Verarbeitung mit logback irgendwo unerwarteten Anmeldung könnten am Ende wird eine Lösung ohne viele logback Dateien sein. Hier ist a link und eine Beispiel-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> 

Auch Sie könnten diese

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

Anstelle der Zugabe separaten logback xmls zu Ihrem pom.xml für jedes Profil hinzufügen oder die IF-Bedingung ist, würde ich folgendes (Wenn Sie vorschlagen habe weniger Unterschied in der xmls') für die einfache bedingte Verarbeitung:

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

Link zur Dokumentation: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging. html # _profile_specific_configuration –

+0

müssen wir noch spring.profiles.active = mode richtig angeben? –

3

Frühling hat die Unterstützung des nächsten Tages <springProperty/> innerhalb Logback XML-Datei beschrieben dieser Tag here. Dies bedeutet, dass Sie die Variable problemlos aus der Spring-Eigenschaftsdatei hinzufügen können, selbst wenn dieser Variablenwert von der Umgebung/Systemvariablen nach Spring aufgelöst wird.

Verwandte Themen