Как отключить вывод из ловушек отключения в тестах Gradle Boot?


13

Вы можете создать проект от start.spring.io до этой проблемы из https://start.spring.io/starter.zip?type=gradle-project&language=java&bootVersion=2.2.5.RELEASE&baseDir=demo&groupId=com.example&artifactId=demo&name = демонстрационный & Description = демонстрационная% 20project% 20for% 20Spring% 20Boot & PackageName = com.example.demo & упаковка = банка & javaVersion = 1,8 & зависимости = h2, данные JPA, веб

У меня есть многомодульное приложение SpringBoot, созданное с помощью gradle, есть куча интеграционных тестов SpringBoot. Когда я делаю сборку, я получаю некоторый вывод из завершения SpringBoot на консоль, как показано ниже. Как отключить этот выход?

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

Для справки, приложение, созданное из start.spring.io с Gradle, не выводит на экран

./gradlew build

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

Вместо этого вывод помещается в build/reports/

В моем случае я НЕ внес никаких изменений в конфигурацию регистрации, которая идет с загрузкой. Нет logback.xml или изменений в application.yml для уровней ведения журнала. Я ожидаю, что gradle перехватывает систему и системную ошибку и отправляет их на, build/reports/но некоторые выходы, похоже, выходят из системы.


2
Регулировка уровня ведения журнала для этих пакетов или классов ниже INFO(или удаление полностью).
Каяман

2
Это INFOстроки журнала уровня. Как вы видите, они происходят из перехватчиков завершения работы и заканчиваются там, где когда-либо настроено ведение журнала. Я предполагаю, что теоретически сообщения могут оказаться в другом месте, чем предполагалось, из-за изменения конфигурации журналирования и последующего асинхронного перехвата. Таким образом, по умолчанию эти строки выводятся на консоль, поскольку предыдущий конфиг был выгружен. Может быть.
Каяман

1
Можете ли вы добавить свой тестовый класс, и ваш основной класс приложения тоже, пожалуйста? И любой соответствующий application.properties/yml связан с конфигурацией источника данных?
Даррен Форсайт

3
Может случиться так, что перехваты отключения происходят, когда рабочие процессы Gradle Test выключаются после того, как их перенаправление вывода завершено. Это может стоить того, чтобы открыть дискуссию.
Эскатос

2
В идеале пружинная загрузка - это отключение в ваших тестах без необходимости полагаться на крюки отключения jvm, это было бы проблемой весны.
Эскатос

Ответы:


4

@eskatos прав. Диспетчер журналов отключается после выполнения контрольного примера перед завершением рабочего процесса. Все перехватчики завершения выполняются, когда рабочий процесс завершается, и перенаправляются обратно на консоль.

Поскольку эти сообщения генерируются при весенней загрузке, лучшее место было бы отфильтровать сообщения о завершении работы с помощью xml конфигурации теста logback.

Что-то вроде logback-test.xml внутри 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
ИМО лучший обходной ответ пока что.
Штеффен Харбич

3

Можно отключить вывод с или решить , что войти из задачи, для того , чтобы контролировать стандартный вывод / STDERR тестовой виртуальной машины Java: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)
    }
}

Эти потоки являются TestLogEvent STANDARD_OUT& STANDARD_ERROR, которые приходят из JVM. Когда можно определить event.messageсодержание extShutdownHook, можно пропустить регистрацию.


см. Вы можете сгенерировать проект из start.spring.io для этой проблемы из start.spring.io/…, чтобы воспроизвести проблему
ams

Это, вероятно, не проблема, потому что INFOэто уровень ведения журнала по умолчанию для Spring; можно установить другие уровни журнала, например. logging.level.org.springframework=TRACEв качестве переменной среды.
Мартин Цайтлер

1
Я считаю, что журналы перехвата генерируются вне тестовой задачи. Не могли бы вы обновить свой ответ, чтобы показать, как можно отфильтровать сообщения о завершении подключения? Я думаю, что лучшее место для фильтрации этих сообщений - там, где они генерируются, в любом случае при загрузке.
Сагар Вирам

3

Я мог бы скрыть специфичные для данных пружины тестовые журналы (основанные на этом стартере пружин ), добавив следующее application.propertiesв src / test / resources:

logging.level.root=ERROR

logging.level.org.springframeworkне будет влиять, например, на com.zaxxer.hikariрегистратор, но у вас есть гибкие настройки здесь.

( root=ERRORэто как "подход кувалдой").

( src/main/resourcesтакже возможно, но действует не только во время тестирования, но и во время выполнения приложения) ( application.propertiesявляется только одним из многих возможных «местоположений» для этого свойства ... см. также: https://docs.spring.io/spring-boot/ docs / current / reference / html / appendix-application-properties.html )

С этим я получаю "тихий" вывод gradle, также на clean build:

$ ./gradlew clean build

BUILD SUCCESSFUL in 10s
7 actionable tasks: 7 executed

0

Gradle имеет тихий режим.

./gradlew build -q

Но вам все еще нужна информация о тестах. Вы можете использовать Jacoco и Sonarqube. Это сработало для меня здесь и здесь .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.