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