Gradleブートテストでシャットダウンフックからの出力をオフにする方法は?


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から生成できます。 = demo&d​​escription = 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
テストクラスを追加できますか。メインアプリケーションクラスも追加してください。そして、データソース設定に関連付けられた関連するapplication.properties/ymlはありますか?
ダレンフォーサイス

3
シャットダウンフックは、Gradleテストワーカープロセスの出力リダイレクトがティアダウンされた後に電源がオフになったときに発生する可能性があります。それは議論を始めるためのgradle / gradle問題の価値があるかもしれません。
エスカトス

2
理想的には、スプリングブートはテストでシャットダウンされ、jvmシャットダウンフックに依存する必要がありません。これは、スプリングの問題です。
エスカトス

回答:


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

一つは、との出力を無効にすることができますログインするかを決めるのテスト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_OUTSTANDARD_ERRORであり、JVMからのものです。event.message包含を判別できる場合extShutdownHook、ロギングをスキップできます。


あなたがからこの問題にstart.spring.ioからプロジェクトを生成することができます参照start.spring.io/...問題を再現するために
AMS

これはINFOSpringのデフォルトのロギングレベルであるため、おそらく問題にはなりません。たとえば、他のログレベルを設定できます。logging.level.org.springframework=TRACE環境変数として。
Martin Zeitler

1
シャットダウンフックログはテストタスクの外部で生成されると思います。回答を更新して、シャットダウンフックメッセージをフィルタリングする方法を示していただけませんか?私はこれらのメッセージをフィルタリングするのに最適な場所は、とにかく春のブーツにあるそれらが生成される場所だと思います。
Sagar Veeram

3

以下をsrc / test / resourcesに追加することで、(このspring-starterに基づく)spring-data固有のテストログを非表示にすることができます。application.properties

logging.level.root=ERROR

logging.level.org.springframeworkcom.zaxxer.hikariロガーなどには影響しませんが、ここには柔軟なオプションがあります。

root=ERROR「スレッジハンマーアプローチ」のようなものです)。

(これsrc/main/resourcesも可能ですが、テスト時だけでなくアプリケーションの実行時にも効果があります)(このプロパティapplication.properties多くの可能な「場所」の 1つにすぎません...次も参照してください: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.