2016-04-27 4 views
3

ich mit dem folgenden Verfahren eine einfache SpringApplicationRunListener Implementierung definiert:Warum ausführen Frühling Boot SpringApplicationRunListener zweimal, wenn Eureka mit

@Override 
public void finished(ConfigurableApplicationContext configurableApplicationContext, Throwable throwable) { 
    logger.info("It's finished"); 
} 

Wenn ich laufen ohne Federwolke Abhängigkeit ich folgendes Protokoll erhalten:

2016-04-27 10:37:37.702 INFO 5720 --- [   main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 
2016-04-27 10:37:37.703 INFO 5720 --- [   main] b.a.test.LazyFilterRuntimeListener  : It's finished 

Allerdings, wenn ich hinzufügen, die folgende Abhängigkeit:

<dependency> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-eureka</artifactId> 
</dependency> 

Dann wird die „Es ist fertig“ Zeile zweimal protokolliert wird, einmal am Ende (wie ohne Federwolke/Eureka) und einmal am Anfang, noch vor dem Frühling Boot-Logo erscheint:

2016-04-27 10:37:35.500 INFO 5720 --- [   main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]255b53dc: startup date [Wed Apr 27 10:37:35 CEST 2016]; root of context hierarchy 
2016-04-27 10:37:35.638 INFO 5720 --- [   main] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring 
2016-04-27 10:37:35.785 INFO 5720 --- [   main] trationDelegate$BeanPostProcessorChecker : Bean 'encrypt.CONFIGURATION_PROPERTIES' of type [class org.springframework.cloud.bootstrap.encrypt.KeyProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 
2016-04-27 10:37:35.786 INFO 5720 --- [   main] trationDelegate$BeanPostProcessorChecker : Bean 'encryptionBootstrapConfiguration' of type [class org.springframework.cloud.bootstrap.encrypt.EncryptionBootstrapConfiguration$$EnhancerBySpringCGLIB$$268d5fc8] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 
2016-04-27 10:37:35.839 INFO 5720 --- [   main] b.c.test.LazyFilterRuntimeListener  : It's finished 
2016-04-27 10:37:35.842 INFO 5720 --- [   main] be.company.test.TestApplication : Started TestApplication in 0.499 seconds (JVM running for 0.86) 

    . ____   _   __ _ _ 
/\\/___'_ __ _ _(_)_ __ __ _ \ \ \ \ 
(()\___ | '_ | '_| | '_ \/ _` | \ \ \ \ 
\\/ ___)| |_)| | | | | || (_| | )))) 
    ' |____| .__|_| |_|_| |_\__, |//// 
=========|_|==============|___/=/_/_/_/ 
:: Spring Boot ::  (v1.2.7.RELEASE) 


... 

2016-04-27 10:37:37.702 INFO 5720 --- [   main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 
2016-04-27 10:37:37.703 INFO 5720 --- [   main] b.c.test.LazyFilterRuntimeListener  : It's finished 
2016-04-27 10:37:37.703 INFO 5720 --- [   main] be.company.test.TestApplication : Started TestApplication in 2.423 seconds (JVM running for 2.721) 

Er erwähnt auch die Linie "Anwendung in ... gestartet" zweimal.

Gibt es einen bestimmten Grund für dieses Verhalten? Ich versuche eine SpringApplicationRunListener zu schreiben, die auf bestimmten Bohnen basiert, die erstellt worden sind. Wenn ich jedoch eine Federwolke hinzufüge, wird das erste Mal, wenn es die finished()-Methode erreicht, der Kontext noch nicht erstellt, daher wird derzeit ein Fehler ausgegeben.

+0

ich das gleiche Problem auftritt. Hast du das Problem gemeldet? Wenn ja, könnten Sie einen Link darauf veröffentlichen? – Ruben

+0

Nein, habe es nicht gemeldet. Wir haben das Problem für unseren Fall bearbeitet. Da wir benötigt haben, dass Beans im Kontext waren, haben wir überprüft, ob die Bean zuerst existierte. https://github.com/camunda/camunda-bpm-spring-boot-starter/commit/19a6061533d56499896025a2886ca48514344a9a#diff-c41da622737469f43899d92d98d1edb0R40. Ich habe keine Ahnung, ob dieses Problem auch an 1.2.x oder 1.3.x gebunden ist. – g00glen00b

Antwort

2

Tatsächlich gibt es ein Problem der doppelten Aufruf für Protokollierung. Standardmäßig startet Spring Boot die Protokollierung der INFO-Ebene.

Previous version of spring boot before 1.3, wie Sie verwenden 1.2.7 Dann verwendet sie

wenn Sie nicht Federstiefel CONSOLE_LOG_PATTERN mit Ihrem MDC Wert außer Kraft setzen kann, dann scheint es, Sie mit jedem Log-Nachricht zu leben haben geschrieben zweimal! (Einmal mit der Feder Startkonsole appender und einmal mit Ihrer Konsole appender mit MDC zu dem Muster)

Aber im Frühjahr Boot 1.3 In neueren Versionen von Spring-Boot können Sie bequem sind nur die base.xml von Spring-Boot und erstellen Sie die folgenden logback.xml.

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

    <root level="INFO"> 
     <appender-ref ref="FILE" /> 
    </root> 
</configuration> 

Für weitere Informationen können Sie wie folgt vor: How to disable logback ConsoleAppender in Spring Boot

Ressourcenlink:

  1. https://github.com/spring-projects/spring-boot/issues/1788
  2. https://github.com/spring-projects/spring-boot/issues/2558
+1

Ich bin nicht ganz sicher, was das bedeutet. Sie schlagen vor, dass die Protokolle selbst zweimal wiederholt werden? Dies ist jedoch nicht das Problem. Die Methode wird sicherlich zweimal aufgerufen.Die Zeitstempel sind auch anders und die "XX" in "Gestartete TestApplication in XX Sekunden" ist auch anders, also bezweifle ich, dass es sich um ein reines Logging-Problem handelt. Es gilt auch ** nur ** gilt für Spring cloud + Spring boot, ich habe keine Probleme, wenn ich Spring Boot (1.2.7) ausschließlich ausführen. – g00glen00b

+0

vereinbart, das gleiche Problem hier, auch passiert bei Verwendung der Feder Cloud Config – Ruben

+2

Das Problem im Frühjahr Wolke Commons Paket verlassen. Dies wurde bereits hier festgelegt: https://github.com/spring-cloud/spring-cloud-commons/pull/100 und ist in der Version 1.1.0+ verfügbar. – Ruben

Verwandte Themen