Come disattivare l'output dagli hook di arresto nei test di avvio graduale?


13

Puoi generare un progetto da start.spring.io a questo problema da https://start.spring.io/starter.zip?type=gradle-project&language=java&bootVersion=2.2.5.RELEASE&baseDir=demo&groupId=com.example&artifactId=demo&name = demo & description = demo% 20project% 20for% 20Spring% 20Boot & packageName = com.example.demo & confezione = vaso & javaVersion = 1.8 & dipendenze = h2, i dati-JPA, web

Ho un'applicazione springBoot multi-modulo costruita con gradle, ci sono un sacco di test di integrazione SpringBoot. Quando eseguo una build, finisco con un output dall'arresto di SpringBoot alla console, come mostrato di seguito. Come posso disattivare questa uscita?

± |master 1 {1} S:3 U:10 ✗|  ./gradlew build

> Task :core:test
2020-02-01 11:20:33.529  INFO 24114 --- [extShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2020-02-01 11:20:33.531  INFO 24114 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2020-02-01 11:20:33.538  INFO 24114 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

> Task :email:test
2020-02-01 11:20:43.820  INFO 24150 --- [extShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2020-02-01 11:20:43.820  INFO 24150 --- [extShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2020-02-01 11:20:43.822  INFO 24150 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-2 - Shutdown initiated...
2020-02-01 11:20:43.822  INFO 24150 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2020-02-01 11:20:43.830  INFO 24150 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
2020-02-01 11:20:43.830  INFO 24150 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-2 - Shutdown completed.

> Task :security:test
2020-02-01 11:20:54.941  INFO 24188 --- [extShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2020-02-01 11:20:54.944  INFO 24188 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2020-02-01 11:20:54.952  INFO 24188 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.1.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 46s
57 actionable tasks: 54 executed, 3 up-to-date

Per riferimento, un'applicazione creata da start.spring.io con gradle non produce output sullo schermo

./gradlew build

BUILD SUCCESSFUL in 779ms
5 actionable tasks: 5 up-to-date

Invece viene inserito l'output build/reports/

Nel mio caso NON ho apportato alcuna modifica alla configurazione della registrazione fornita con l'avvio. Non esiste logback.xml o modifiche a application.yml per i livelli di registrazione. Mi aspetto che Gradle stia rilevando il sistema e gli errori di sistema e li invii a, build/reports/ma alcuni output sembrano sfuggire al sistema.


2
Regolazione del livello di registrazione per quei pacchetti o classi al di sotto INFO(o rimozione completa).
Kayaman,

2
Quelle sono INFOlinee di registro di livello. Provengono dagli hook di arresto, come vedi, e finiscono dove è sempre configurata la registrazione. Suppongo in teoria che i messaggi potrebbero finire in un posto diverso da quello previsto, a causa della modifica della configurazione della registrazione e degli hook che vengono eseguiti in modo asincrono in seguito. Quindi avrebbe predefinito quelle linee sulla console, poiché la precedente configurazione era scarica. Può essere.
Kayaman,

1
Puoi aggiungere la tua classe di test e anche la tua classe di applicazione principale, per favore? E qualsiasi application.properties/yml rilevante associato alla configurazione dell'origine dati?
Darren Forsythe

3
È possibile che gli hook di arresto si verifichino quando i processi di lavoro del test Gradle vengono disattivati ​​dopo che il loro reindirizzamento dell'output è stato ridotto. Ciò potrebbe valere la pena di dare un voto di apertura / discussione per aprire la discussione.
eskatos

2
Idealmente, l'avvio di primavera è l'arresto nei test senza dover fare affidamento sui ganci di arresto jvm, questo sarebbe un problema di primavera.
eskatos

Risposte:


4

@eskatos ha ragione. Il gestore della registrazione viene rimosso dopo l'esecuzione del caso di test prima della chiusura del processo di lavoro. Tutti gli hook di arresto vengono eseguiti quando il processo di lavoro viene arrestato e reindirizzati alla console.

Poiché questi messaggi vengono generati dall'avvio a molla, la posizione migliore sarebbe quella di filtrare i messaggi di arresto utilizzando l'xml di configurazione del test di logback.

Qualcosa come logback-test.xml all'interno di src / test / resources

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
                <expression>return event.getThreadName().contains("ShutdownHook");</expression>
            </evaluator>
            <OnMismatch>NEUTRAL</OnMismatch>
            <OnMatch>DENY</OnMatch>
        </filter>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

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

build.gradle

testCompile 'org.codehaus.janino:janino'

1
IMO la migliore soluzione alternativa finora.
Steffen Harbich

3

È possibile disabilitare l'output con o decidere cosa registrare di un'attività, al fine di controllare lo stdout / stderr del test JVM:TestLoggingContainer testLogging.showStandardStreams = false onOutputTest

apply plugin: 'java'

test {

    // show standard out and standard error of the test JVM on the console
    // can be used to disable the console output:
    testLogging.showStandardStreams = true

    // listen to standard out and standard error of the test JVM
    // can be used to make the logging optional:
    onOutput { descriptor, event ->
        logger.lifecycle("Test: " + descriptor + " produced standard out/err: " + event.message)
    }
}

Questi flussi sono TestLogEvent STANDARD_OUT& STANDARD_ERROR, che provengono dalla JVM. Quando si può determinare un event.messagecontenimento extShutdownHook, si può saltare la registrazione.


vedi È possibile generare un progetto da start.spring.io a questo problema da start.spring.io/… per riprodurre il problema
am

Probabilmente non è un problema, perché INFOè il livello di registrazione predefinito per Spring; si possono impostare altri livelli di registro, ad es. logging.level.org.springframework=TRACEcome variabile ambientale.
Martin Zeitler il

1
Credo che i registri hook di spegnimento vengano generati al di fuori dell'attività di test. Potresti aggiornare la tua risposta per mostrare come si possono filtrare i messaggi hook di spegnimento? Penso che il posto migliore per filtrare questi messaggi sia dove sono generati che è comunque in avvio di primavera.
Sagar Veeram

3

Potrei nascondere il logging di test specifico dei dati di primavera (basato su questo avviatore di primavera ) aggiungendo il seguente a SRC application.properties/ test / risorse:

logging.level.root=ERROR

logging.level.org.springframeworknon avrà alcun effetto, ad esempio com.zaxxer.hikari, sul logger, ma qui hai opzioni flessibili .

( root=ERRORè come "l'approccio della mazza").

( src/main/resourcesè anche possibile ma ha effetto non solo al test ma anche al runtime dell'applicazione) ( application.propertiesè solo una delle molte "posizioni" possibili per questa proprietà ... vedi anche: https://docs.spring.io/spring-boot/ docs / current / reference / html / appendix-application-properties.html )

Con questo ottengo un output gradle "silenzioso", anche su un clean build:

$ ./gradlew clean build

BUILD SUCCESSFUL in 10s
7 actionable tasks: 7 executed

0

Gradle ha una modalità silenziosa.

./gradlew build -q

Ma hai ancora bisogno di informazioni sui test. puoi usare Jacoco e Sonarqube. Ha funzionato per me qui e qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.