Como desativar a saída dos ganchos de desligamento nos testes de inicialização gradle?

13

Você pode gerar um projeto de start.spring.io para esse problema em 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 & descrição = Demonstração% 20projeto% 20for% 20Spring% 20Boot & packageName = com.example.demo & packaging = jar & javaVersion = 1.8 & dependencies = h2, data-jpa, web

Eu tenho um aplicativo springBoot multi-módulo construído com gradle, existem vários testes de integração do SpringBoot. Quando faço uma compilação, acabo com alguma saída do desligamento do SpringBoot para o console, como mostrado abaixo. Como desativo esta saída?

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

Para referência, um aplicativo criado a partir de start.spring.io com gradle não produz saída na tela

./gradlew build

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

Em vez disso, a saída é colocada em build/reports/

No meu caso, NÃO fiz alterações na configuração de log que acompanha a inicialização. Não há logback.xml ou alterações no application.yml para níveis de log. Espero que o gradle esteja capturando o sistema e com erros do sistema e enviando-os para o, build/reports/mas algumas saídas parecem estar escapando para o sistema.

ams
fonte
2
Ajustando o nível de log desses pacotes ou classes para abaixo INFO(ou removendo completamente).
Kayaman
2
Essas são INFOas linhas de log niveladas. Eles se originam dos ganchos de desligamento, como você vê, e terminam onde quer que o log esteja configurado. Suponho que, em teoria, as mensagens possam terminar em um local diferente do pretendido, devido à alteração da configuração do log e aos ganchos sendo executados de forma assíncrona posteriormente. Portanto, essas linhas serão padronizadas para o console, pois a configuração anterior foi descarregada. Talvez.
Kayaman
11
Você pode adicionar sua classe de teste e sua classe principal de aplicativos também, por favor? E qualquer application.properties/yml relevante associado à configuração da fonte de dados?
Darren Forsythe
3
Pode ser que os ganchos de desligamento ocorram quando os processos do trabalhador de teste Gradle são desativados após o redirecionamento de saída ser interrompido. Isso pode valer uma questão gradle / gradle para abrir a discussão.
eskatos 4/03
2
Idealmente, a inicialização por mola é encerrada em seus testes sem precisar depender dos ganchos de encerramento da jvm, isso seria um problema da primavera.
eskatos 4/03

Respostas:

4

@eskatos está certo. O gerenciador de logs é desmontado após a execução do caso de teste antes do encerramento do processo do trabalhador. Todos os ganchos de encerramento são executados quando o processo do operador é encerrado e são redirecionados de volta ao console.

Como essas mensagens são geradas pela inicialização por mola, o melhor lugar seria filtrar as mensagens de desligamento usando o xml de configuração do teste de logback.

Algo como logback-test.xml dentro de 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'
Sagar Veeram
fonte
11
A IMO é a melhor solução alternativa até o momento.
Steffen Harbich
3

É possível desativar a saída com ou decidir o que registrar uma tarefa, a fim de controlar o stdout / stderr da JVM de teste: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)
    }
}

Esses fluxos são TestLogEvent STANDARD_OUT& STANDARD_ERROR, que são provenientes da JVM. Quando se pode determinar uma event.messagecontenção extShutdownHook, pode-se pular o registro.

Martin Zeitler
fonte
veja Você pode gerar um projeto de start.spring.io a esta questão a partir de start.spring.io/... para reproduzir o problema
AMS
Provavelmente não é um problema, porque INFOé o nível de log padrão do Spring; pode-se definir outros níveis de log, por exemplo. logging.level.org.springframework=TRACEcomo variável ambiental.
Martin Zeitler 4/03
11
Acredito que os logs do gancho de desligamento sejam gerados fora da tarefa de teste. Você poderia atualizar sua resposta para mostrar como é possível filtrar as mensagens do gancho de desligamento? Eu acho que o melhor lugar para filtrar essas mensagens é onde elas são geradas, seja na inicialização de qualquer maneira.
Sagar Veeram 7/03
3

Eu poderia ocultar o teste de registro de dados específico da primavera (com base neste iniciador de primavera ) adicionando o seguinte application.propertiesa src / test / resources:

logging.level.root=ERROR

logging.level.org.springframeworknão terá efeito, por exemplo com.zaxxer.hikari, no logger, mas você tem opções flexíveis aqui.

( root=ERRORé como a "abordagem da marreta").

( src/main/resourcestambém é possível, mas tem efeito não apenas no teste, mas também no tempo de execução do aplicativo) ( application.propertiesé apenas um dos muitos "locais" possíveis para essa propriedade ... consulte também: https://docs.spring.io/spring-boot/ docs / current / reference / html / appendix-application-properties.html )

Com isso, recebo uma saída gradle "silenciosa", também em clean build:

$ ./gradlew clean build

BUILD SUCCESSFUL in 10s
7 actionable tasks: 7 executed
xerx593
fonte
0

Gradle tem um modo silencioso.

./gradlew build -q

Mas você ainda precisa de informações sobre os testes. você pode usar jacoco e sonarqube. Funcionou para mim aqui e aqui .

Abdysamat
fonte