श्लेष बूट परीक्षणों में शटडाउन हुक से आउटपुट कैसे बंद करें?


13

आप इस मुद्दे को https://start.spring.io/starter.zip?type=gradle-project&language=java&bootVersion=2.2.2.RELEASE&baseDir=demo&groupId=com.example&artifactId00000I से इस मुद्दे पर एक प्रोजेक्ट जनरेट कर सकते हैं। = डेमो और विवरण = डेमो% 20project% 20For% 20Spring% 20Boot और PackageName = com.example.demo एवं पैकेजिंग = जार और javaVersion = 1.8 और निर्भरता = h2, डेटा जेपीए, वेब

मेरे पास एक मल्टी-मॉड्यूल स्प्रिंगबूट एप्लिकेशन है जिसे ग्रेडेल के साथ बनाया गया है, स्प्रिंगबूट एकीकरण परीक्षणों का एक गुच्छा है। जब मैं निर्माण करता हूं तो मैं स्प्रिंगबूट शटडाउन से कुछ आउटपुट के साथ कंसोल को समाप्त करता हूं जैसा कि नीचे दिखाया गया है। मैं इस आउटपुट को कैसे बंद करूं?

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

संदर्भ के लिए प्रारंभ से बना एक अनुप्रयोग। साइनिंग .io जिसके साथ ग्रेडल स्क्रीन पर कोई आउटपुट नहीं देता है

./gradlew build

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

इसके बजाय आउटपुट में रखा गया है build/reports/

मेरे मामले में मैंने बूटिंग के साथ आने वाले लॉगिंग कॉन्फ़िगरेशन में कोई बदलाव नहीं किया है। कोई logback.xml नहीं है, या लॉगिंग स्तरों के लिए application.yml में परिवर्तन होता है। मैं उम्मीद कर रहा हूं कि ग्रेडेल सिस्टम आउट और सिस्टम त्रुटि को कैप्चर कर रहा है और उन्हें भेज रहा है, build/reports/लेकिन कुछ आउटपुट सिस्टम आउट करने से बच रहे हैं।


2
नीचे INFOया (या पूरी तरह से हटाने के लिए) उन संकुल या वर्गों के लिए लॉगिंग स्तर को समायोजित करना ।
कायमान

2
वे INFOस्तर लॉग लाइनें हैं। वे शटडाउन हुक से उत्पन्न होते हैं जैसा कि आप देखते हैं, और वे समाप्त होते हैं जहां कभी लॉगिंग कॉन्फ़िगर किया गया है। मुझे लगता है कि सिद्धांत रूप में संदेश एक अलग जगह पर समाप्त हो सकते हैं, लॉगिंग कॉन्फ़िगरेशन बदलने और बाद में अतुल्यकालिक रूप से निष्पादित होने वाले हुक के कारण। इसलिए यह उन पंक्तियों को कंसोल में डिफ़ॉल्ट कर देगा, क्योंकि पिछला कॉन्फ़िगरेशन अनलोड था। शायद।
20

1
क्या आप अपना परीक्षण वर्ग और अपने मुख्य आवेदन वर्ग को भी जोड़ सकते हैं? और किसी भी प्रासंगिक application.properties/yml के साथ डेटा स्रोत कॉन्फ़िगर किया गया है?
डैरेन फ़ॉर्सिथे

3
यह हो सकता है कि शटडाउन हुक तब होते हैं जब ग्रैडल परीक्षण कार्यकर्ता प्रक्रियाओं को उनके आउटपुट पुनर्निर्देशन के बाद फाड़ दिया जाता है। यह चर्चा खोलने के लिए एक ग्रेड / ग्रेडल मुद्दे के लायक हो सकता है।
14 अप्रैल को eskatos

2
आदर्श रूप से स्प्रिंग बूट आपके परीक्षणों में शटडाउन है, बिना jvm शटडाउन हुक पर भरोसा करने के लिए, यह एक वसंत मुद्दा होगा।
14 अप्रैल को eskatos

जवाबों:


4

@ सीसेटोस सही है। कार्यकर्ता मामले को बंद करने से पहले परीक्षण मामले को निष्पादित करने के बाद लॉगिंग प्रबंधक को फाड़ दिया जाता है। सभी शटडाउन हुक निष्पादित किए जाते हैं जब कार्यकर्ता प्रक्रिया बंद होती है और कंसोल पर वापस निर्देशित होती है।

चूंकि ये संदेश स्प्रिंग बूट द्वारा उत्पन्न किए जाते हैं, इसलिए लॉगबैक टेस्ट कॉन्फ़िगरेशन xml का उपयोग करके शटडाउन संदेशों को फ़िल्टर करने के लिए सबसे अच्छी जगह होगी।

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
IMO अब तक का सबसे अच्छा वर्कअराउंड उत्तर।
स्टीफन हरबिच

3

परीक्षण वीवीएम के स्टडआउट / स्टैडर को नियंत्रित करने के लिए, आउटपुट को किसी कार्य के साथ अक्षम कर सकते हैं या किसी कार्य को लॉग इन करने का निर्णय ले सकते हैं :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स्प्रिंग के लिए डिफ़ॉल्ट लॉगिंग स्तर है; कोई अन्य लॉग-लेवल सेट कर सकता है, जैसे। logging.level.org.springframework=TRACEपर्यावरण चर के रूप में।
मार्टिन ज़ेटलर

1
मेरा मानना ​​है कि शटडाउन हुक लॉग परीक्षण कार्य के बाहर उत्पन्न होते हैं। क्या आप अपना उत्तर यह दिखाने के लिए अपडेट कर सकते हैं कि कोई शटडाउन हुक संदेशों को कैसे फ़िल्टर कर सकता है? मुझे लगता है कि इन संदेशों को फ़िल्टर करने के लिए सबसे अच्छी जगह है, जहां वे उत्पन्न होते हैं जो कि स्प्रिंग बूट वैसे भी हैं।
सागर वीरम

3

मैं src / test / Resources के लिए follwoing जोड़कर स्प्रिंग-डेटा विशिष्ट टेस्ट-लॉगिंग ( इस स्प्रिंग-स्टार्टर के आधार पर ) को छिपा सकता हूं :application.properties

logging.level.root=ERROR

logging.level.org.springframeworkजैसे com.zaxxer.hikariलकड़हारे पर प्रभाव नहीं होगा , लेकिन आपके पास लचीले विकल्प हैं यहां हैं।

(root=ERROR "स्लेज हैमर अप्रोच" की तरह है)।

( src/main/resourcesयह भी संभव है, लेकिन न केवल परीक्षण पर, बल्कि एप्लिकेशन रनटाइम पर भी प्रभाव है) ( इस संपत्ति के लिए application.propertiesकेवल कई संभावित "स्थानों" में से एक है ... यह भी देखें: https://docs.spring.io/spring-boot/ डॉक्स / वर्तमान / संदर्भ / एचटीएमएल / परिशिष्ट-आवेदन-गुण.html )

इसके साथ मुझे एक "साइलेंट" ग्रेडल आउटपुट मिलता है, वह भी एक clean build:

$ ./gradlew clean build

BUILD SUCCESSFUL in 10s
7 actionable tasks: 7 executed

0

ग्रैडल में एक शांत मोड है।

./gradlew build -q

लेकिन आपको अभी भी परीक्षणों के बारे में जानकारी की आवश्यकता है। आप जैकोको और सोनारक्बी का उपयोग कर सकते हैं। इसने यहां और यहां मेरे लिए काम किया ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.