Gradle 부팅 테스트에서 종료 후크의 출력을 끄는 방법은 무엇입니까?


13

https://start.spring.io/starter.zip?type=gradle-project&language=java&bootVersion=2.2.5.RELEASE&baseDir=demo&groupId=com.example&artifactId=demo&name 에서 start.spring.io에서이 이슈까지 프로젝트를 생성 할 수 있습니다. = demo & description = Demo % 20project % 20for % 20Spring % 20Boot & packageName = com.example.demo & packaging = jar & javaVersion = 1.8 & dependencies = h2, data-jpa, web

gradle로 빌드 된 다중 모듈 springBoot 응용 프로그램이 있으며 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

참조를 위해 gradle을 사용하여 start.spring.io에서 작성된 응용 프로그램은 화면에 출력을 생성하지 않습니다.

./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
테스트 클래스를 추가하고 주 응용 프로그램 클래스도 추가 할 수 있습니까? 그리고 datasource config와 관련된 application.properties/yml이 있습니까?
Darren Forsythe

3
출력 리디렉션이 해제 된 후 Gradle 테스트 작업자 프로세스가 종료되면 종료 후크가 발생할 수 있습니다. 토론을 열려면 gradle / gradle 문제가 가치가 있습니다.
eskatos

2
이상적으로 스프링 부트는 jvm 종료 후크에 의존하지 않고 테스트에서 종료됩니다. 이는 스프링 문제입니다.
eskatos

답변:


4

@eskatos가 맞습니다. 작업자 프로세스를 종료하기 전에 테스트 케이스가 실행 된 후 로깅 관리자가 해제됩니다. 작업자 프로세스가 종료되고 콘솔로 다시 리디렉션되면 모든 종료 후크가 실행됩니다.

이러한 메시지는 스프링 부트로 생성되므로 로그 백 테스트 구성 xml을 사용하여 종료 메시지를 필터링하는 것이 가장 좋습니다.

src / test / resources 내부의 logback-test.xml과 같은 것

<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는 지금까지 가장 좋은 해결책입니다.
Steffen Harbich

3

하나는과 출력을 비활성화 할 수 있습니다 또는 로그할지 결정 (A)의 테스트 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)
    }
}

이 스트림은 TestLogEvent STANDARD_OUT& STANDARD_ERROR이며 JVM에서 제공됩니다. event.message포함을 결정할 수 있으면 extShutdownHook로깅을 건너 뛸 수 있습니다.


당신은에서이 문제에 start.spring.io에서 프로젝트를 생성 할 수 있습니다 참조 start.spring.io/... 문제를 재현
AMS

INFOSpring의 기본 로깅 레벨 이기 때문에 문제가 아닐 수 있습니다 . 예를 들어 다른 로그 수준을 설정할 수 있습니다. logging.level.org.springframework=TRACE환경 변수로.
마틴 Zeitler

1
종료 후크 로그가 테스트 작업 외부에서 생성되었다고 생각합니다. 종료 후크 메시지를 필터링하는 방법을 보여주기 위해 답변을 업데이트 할 수 있습니까? 이 메시지를 필터링하는 가장 좋은 장소는 어쨌든 봄 부팅 인 메시지가 생성되는 곳이라고 생각합니다.
Sagar Veeram

3

src / test / resources에 다음 을 추가하여 스프링 데이터 특정 테스트 로깅 ( 이 스프링 스타터 기반)을 숨길 수 있습니다.application.properties

logging.level.root=ERROR

logging.level.org.springframeworkcom.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를 사용할 수 있습니다. 여기여기 에 나를 위해 일 했다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.