2015-05-31 5 views
10

का उपयोग नहीं कर रहा है हालांकि मुझे लगता है कि नीचे दिए उपयोगकर्ताओं को इनाम से सम्मानित किया है मदद करने का प्रयास किया है, मूल प्रश्न अनुत्तरित बना हुआ है। कोई वास्तविक व्यावहारिक समाधान यह सुनिश्चित करने के लिए मौजूद है कि logback.groovy कॉन्फ़िगर किया गया लॉगिंग जूनिट परीक्षणों के भीतर सम्मानित किया जाता है। परीक्षण logback config लोड और यह सही स्तर अभी भी किसी भी पर वास्तविक परीक्षा प्रवेश (विशेष रूप से slf4j के माध्यम से) है और अभी तक रिपोर्ट या स्तर पता लगा हैलॉगर slf4j logback कॉन्फ़िगर किया गया स्तर

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

मेरे लॉगिंग एक logback.groovy फ़ाइल

के माध्यम से logback से कॉन्फ़िगर किया गया है अब, जब मेरे Maven पोम परियोजना है कि अन्य सभी परियोजनाओं को एकत्रित करती शुरू होता है, यह उन सब को सिस्टम सही लॉगिंग स्तर सेट करने के लिए संपत्ति से गुजरता है।

हालांकि, जब जूनिट परीक्षण चलते हैं, किसी कारण से, लॉगर सही स्तर नहीं लेता है, भले ही परीक्षण कक्षाएं स्थिर @beforeClass सुनिश्चित करें कि लॉगबैक ठीक से कॉन्फ़िगर किया गया है।

यह समस्याएं हैं जो परीक्षण में लॉगर्स नहीं हैं - अच्छी तरह से - हाँ उन्हें भी - वास्तविक समस्या यह है कि कोड अनुभागों में लॉगर्स जो चलते हैं (मेरे सभी प्रोग्राम हर जगह लॉगर्स) सेट होते हैं गलत लॉगिंग स्तर पर। जब वे प्रोग्राम परीक्षण कॉन्फ़िगर किए जाते हैं तो वे लॉगिंग नहीं कर रहे हैं।

हालांकि, जब लॉगबैक logback.goovy फ़ाइल के साथ प्रारंभ होता है तो परियोजना सही रिपोर्ट कर रही है। हालांकि, वास्तविक लॉगिंग स्तर TRACE पर सेट है या सभी

नीचे दिए गए आउटपुट से, यह स्पष्ट है कि लॉगबैक INFO को कॉन्फ़िगर किया गया है। लेकिन TRACE (अंतिम पंक्ति) में पहला प्रोजेक्ट लॉगिंग स्टेटमेंट दिखाता है कि उठाया नहीं जा रहा है।

सहायता।

------------------------------------------------------- 
T E S T S 
------------------------------------------------------- 
Running groovy.text.StreamingTemplateEngineTest 
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.245 sec 
Running net.abcd.templating.InlinerTest 
01:22:15,265 |-INFO in [email protected] - Added status listener of type [ch.qos.logback.core.status.OnConsoleStatusListener] 
01:22:15,290 |-INFO in [email protected] - Setting ReconfigureOnChangeFilter scanning period to 5 minutes 
01:22:15,290 |-INFO in ReconfigureOnChangeFilter{invocationCounter=0} - Will scan for changes in [[C:\Users\ABDC\Dropbox\workspace\abcd\AbcdTemplating\conf\logback.groovy]] every 300 seconds. 
01:22:15,290 |-INFO in [email protected] - Adding ReconfigureOnChangeFilter as a turbo filter 
01:22:15,312 |-INFO in ch.qos.logback.classic.gaffer.ConfigurationDeleg[email protected] - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender] 
01:22:15,316 |-INFO in [email protected] - Naming appender as [STDOUT] 
*********************************************************** 

LOGGING MODE PROPERTY 'net.abcd.logging.level' SET TO: [info] 
IT CAN BE SET TO: OFF, ERROR, WARN, INFO, DEBUG, TRACE, ALL, INFO 

*********************************************************** 
getLogLevel() returned 'INFO' 
01:22:15,496 |-INFO in [email protected] - Setting level of logger [ROOT] to INFO 
01:22:15,532 |-INFO in [email protected] - Attaching appender named [STDOUT] to Logger[ROOT] 
01:22:15.846 [main] TRACE net.abcd.templating.Inliner - Document: 

मेरे logback.groovy फ़ाइल है:

displayStatusOnConsole() 
scan('5 minutes') // Scan for changes every 5 minutes. 
setupAppenders() 
setupLoggers() 

def displayStatusOnConsole() { 
    statusListener OnConsoleStatusListener 
} 

def setupAppenders() { 
    appender('STDOUT', ConsoleAppender) { 
     encoder(PatternLayoutEncoder) { 
      pattern = "%d{HH:mm:ss.SSS} [%thread] %-5level %-16logger{50} - %msg%n" 
     } 
    } 
} 


def setupLoggers() {  
    def loglevel = getLogLevel() 
    println("getLogLevel() returned '${loglevel}'") 
    root(loglevel, ['STDOUT']) 
} 

def getLogLevel() { 
    def mode = System.getProperty('net.abcd.logging.level', '') 
    println("***********************************************************") 
    println("") 
    println("LOGGING MODE PROPERTY 'net.abcd.logging.level' SET TO: [${mode}]") 
    println("IT CAN BE SET TO: OFF, ERROR, WARN, INFO, DEBUG, TRACE, ALL, INFO") 
    println("") 
    println("***********************************************************") 
    switch(mode.toLowerCase()){ 
    case 'off': 
     return OFF 
    case 'error': 
     return ERROR 
    case 'warn': 
     return WARN 
    case 'info': 
     return INFO 
    case 'debug': 
     return DEBUG 
    case 'trace': 
     return TRACE 
    case 'all': 
     return ALL 
    default: 
     return INFO 
    } 
} 
+1

मुझे नहीं पता कि यह मदद करता है, लेकिन जुनीट अपने स्वयं के वर्ग लोडर को स्थापित करता है, जो लॉगिंग फ्रेमवर्क में हस्तक्षेप करने के लिए जाना जाता है। – llogiq

+0

@llogiq मुझे पता है। .... फिर जूनिट रिपोर्ट द्वारा कॉन्फ़िगर क्यों किया गया है, भले ही व्यक्तिगत परीक्षण न हों। और इसे कैसे ठीक किया जाए? –

उत्तर

3

मैं भी मेरी JUnit परीक्षण पर एक समान मुद्दे से मुलाकात की। मुझे कोई अच्छा समाधान नहीं मिला। मैं चारों ओर काम नीचे प्रयोग किया है:

import ch.qos.logback.classic.Level; 
import ch.qos.logback.classic.Logger; 
import org.slf4j.LoggerFactory; 
... 
static Logger logger; 
static{ 
    // Logger.ROOT_LOGGER_NAME == "ROOT" 
    logger = ((Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)); 
    logger.setLevel(Level.INFO); 
} 

...

मैं अपने मामले में लगता है, किसी भी तरह एक पुस्तकालय का उपयोग करता है यह खुद ConsoleAppender उदाहरण जिसका नाम 'STDOUT' नहीं है। मुझे आशा है कि रूट लॉग स्तर को सेट करने से समस्या हल होनी चाहिए।

root(loglevel, ['ROOT']); 
+0

यह सहायक है। मुझे यकीन नहीं है कि यह समस्या हल करता है हालांकि मैं रिएक्टर बिल्ड द्वारा प्रदान की गई संपत्ति के आधार पर विभिन्न स्तरों पर लॉग परीक्षण करता हूं। लेकिन चिमिंग के लिए धन्यवाद। –

+0

कोशिश की। काम नहीं किया –

1

हम आम तौर पर slf4j के माध्यम से प्रत्येक लॉगिंग को रूट करते हैं और फिर लॉगबैक के साथ लॉगिंग को कॉन्फ़िगर करते हैं। इसलिए हमारे Maven निर्भरता की तरह लग रहे:

<dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>${slf4j.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>jcl-over-slf4j</artifactId> 
     <version>${slf4j.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>log4j-over-slf4j</artifactId> 
     <version>${slf4j.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>jul-to-slf4j</artifactId> 
     <version>${slf4j.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-core</artifactId> 
     <version>${logback.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>${logback.version}</version> 
    </dependency> 

तो कुछ निर्भरता जावा-कॉमन्स-लॉगिंग (JCL), log4j, या java.util.logging (जुलाई) की तुलना में अपने प्रवेश slf4j को पाट हो जाता है का उपयोग करता है। एप्लिकेशन लॉगिंग slf4j का भी उपयोग करता है और यह लॉगबैक के साथ कॉन्फ़िगर किया गया है।

तो नियंत्रण में बाहरी निर्भरताओं के लॉगिंग के लिए आपको पुलों में से एक (जैसे jcl-over-slf4j) का उपयोग करने की आवश्यकता हो सकती है।

संपादित करें: पावेल हॉरल, जूल के लिए धन्यवाद, और हाँ, आप सही हैं। केवल निर्भरताओं को जोड़ने की तुलना में थोड़ा अधिक करने की आवश्यकता है। हमारे पास एक लॉगबैक कॉन्फ़िगरेटर भी है जो स्पष्ट रूप से SLF4JBridgeHandler.install() को कॉल करता है। हमारा कॉन्फ़िगरेटर लॉगबैक कॉन्फ़िगरेशन फ़ाइल भी लोड करता है और मैं इस कॉल के बारे में भूल गया। लेकिन मैं मुख्य रूप से बाह्य निर्भरताओं और इन पुलों द्वारा उपयोग की जाने वाली एकाधिक लॉगिंग पुस्तकालयों के साथ किसी समस्या की दिशा में इंगित करना चाहता था जो लॉगबैक की छत के नीचे विभिन्न लॉगिंग पुस्तकालयों को रख सकता है।

+0

* "मुझे यह भी पता नहीं है" * -> ['java.util.logging'] (http://docs.oracle.com/javase/7/docs/api/java/util/logging/package-summary .html) ... और यह इतना आसान नहीं है * बस सही निर्भरता का उपयोग * - http://stackoverflow.com/questions/9117030/jul-to-slf4j-bridge –

+0

सब कुछ SLF4J का उपयोग कर रहा है। यही कारण है कि यह मेरे लिए एक रहस्य है कि लॉगिंग कॉन्फ़िगरेशन सही क्यों पंजीकृत करता है लेकिन परीक्षण सभी लॉग इन करते हैं जैसे कि स्तर ट्रेस या कोई भी है। –

+0

खेलने के लिए धन्यवाद। मैंने आपको बक्षीस दिया, भले ही यह समस्या का समाधान न करे। यह एक मूल्यवान जोड़ है। –

संबंधित मुद्दे