2012-07-22 5 views
25

डिफ़ॉल्ट रूप से सभी Logger आउटपुट, जब कोई एप्लिकेशन चल रहा है, तब दिखाई देता है, जब एप्लिकेशन का परीक्षण किया जाता है तो म्यूट होता है।Play में Logger.debug आउटपुट को कैसे बल दें! ढांचे specs2 परीक्षण?

specs2 रिपोर्ट में डीबग, इंफोस इत्यादि को कैसे लागू किया जाए?

उत्तर

21

सबसे पहले, आपको कुछ पृष्ठभूमि पसंद हो सकती है क्यों परीक्षण मोड में लॉगिंग अक्षम है। इस नाटक मंच में एक प्रश्न के Guillame Bort के जवाब था (this thread देखें):

लकड़हारा अब क्योंकि यह एक विशाल PermGen अंतरिक्ष रिसाव पैदा कर रहा था जब परीक्षण चलाने के लिए परीक्षण मोड में अक्षम है। लेकिन हम एक फोर्क किए गए जेवीएम में परीक्षण चलाने के लिए काम कर रहे हैं ताकि हम इसे जल्द ही सक्षम कर सकें।

समाधान के लिए, मैं इस (स्काला कोड) की तरह अपने ही लकड़हारा बनाया:

import play.api.{Play, LoggerLike, Logger} 
import org.slf4j.LoggerFactory 
import org.slf4j.impl.SimpleLoggerFactory 

object MyLogger extends LoggerLike { 

    val factory = if (Play.isTest(Play.current)) { 
    new SimpleLoggerFactory() 
    } else { 
    LoggerFactory.getILoggerFactory 
    } 

    val redirectDebugToInfo = factory.isInstanceOf[SimpleLoggerFactory] 

    val logger = factory.getLogger("application") 

    def apply(name: String): Logger = new Logger(factory.getLogger(name)) 

    def apply[T](clazz: Class[T]): Logger = new Logger(factory.getLogger(clazz.getCanonicalName)) 

    // this method is to make debug statements to show up in test mode 
    override def debug(m: => String) = { 
    if (redirectDebugToInfo) { 
     info(m) 
    } else { 
     super.debug(m) 
    } 
    } 
} 

मैं कैसे इस कोड को सामान्य रूप में PermGen लीक के संबंध में बर्ताव करता है पता नहीं है, लेकिन अभी तक मैं नहीं था उस समस्या नहीं है। यह आप इस निर्भरता जोड़ने की जरूरत है काम करने के लिए:

"org.slf4j" % "slf4j-simple" % "1.6.4" 
+0

आप 'SLF4J साथ कैसे सामना करते हैं : कक्षा पथ में कई एसएलएफ 4 जे बाइंडिंग शामिल हैं। चेतावनी? – Rajish

+0

@ राजिश मैं इसके साथ सौदा नहीं करता, क्योंकि यह सिर्फ एक अस्थायी कामकाज है। मेरे लिए चेतावनी ने कोई मुद्दा नहीं दिया। क्या यह आपको कोई समस्या देता है? – rintcius

+0

@rintcius कामकाज के लिए धन्यवाद! मैं जावा का उपयोग कर रहा हूं और जहां तक ​​मुझे पता है कि मैं सिर्फ स्कैला कोड मिश्रण कर सकता हूं। मैंने इसे अपने जावा प्रोजेक्ट में स्कैला फ़ाइल के रूप में जोड़ा लेकिन यह काम नहीं कर रहा है। अपने कोड को देखते हुए मुझे सामान्य रूप से Logger.debug ("डीबग") विचारों के रूप में लॉग इन करने में सक्षम होना चाहिए? मैंने निर्भरता भी जोड़ दी। –

3

क्या आप उसे प्ले Logger source को देखें, तो आपको लगता है कि प्रवेश टेस्ट मोड में अक्षम है देखेंगे।

यदि आप वास्तव में लॉगिंग करना चाहते हैं, तो आप परीक्षण के लिए लॉगिंग कॉन्फ़िगरेशन फ़ाइल बना सकते हैं और इसे सिस्टम प्रॉपर्टी "logger.file" के रूप में चलाने के लिए पास कर सकते हैं।

उदाहरण लॉगिंग विन्यास (परियोजना जड़ में परीक्षण logger.xml फ़ाइल):

<configuration> 
    <conversionRule conversionWord="coloredLevel" converterClass="play.api.Logger$ColoredLevel" /> 
    <logger name="application" level="INFO"> 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <encoder> 
     <pattern>%coloredLevel %logger{15} - %message%n%xException{5}</pattern> 
     </encoder> 
    </appender> 
    </logger> 
</configuration> 

चल रहा है परीक्षण:

JAVA_OPTS="-Dlogger.file=test-logger.xml" play test 
+1

क्या आपने वास्तव में इसे आजमाया था? क्योंकि मेरे अनुभव से यह काम नहीं करता है। – Rajish

+0

हां। यह मेरे लिए काम किया। –

5

मैं conf के तहत एक logger.xml फ़ाइल बनाई इस जैसे:

<configuration> 
    <conversionRule conversionWord="coloredLevel" converterClass="play.api.Logger$ColoredLevel" /> 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <encoder><pattern>%coloredLevel %logger{15} - %message%n%xException{5}</pattern></encoder> 
    </appender> 

    <logger name="play" level="ERROR" /> 
    <logger name="application" level="INFO" /> 

    <root level="ERROR"> 
     <appender-ref ref="STDOUT" /> 
    </root> 
</configuration> 

फिर मैं निम्नलिखित आदेश के साथ अपना खेल वातावरण शुरू करता हूं:

खेलने -Dlogger.file = conf/logger.xml

देखा! परीक्षण में डेटा लॉगिंग। यह स्मृति रिसाव का कारण बनता है, लेकिन विकास के दौरान अमूल्य है।

FakeApplication(additionalConfiguration = Map(
    "logger.application" -> "DEBUG" 
)) 

कि डिबग और उच्च उत्पादन के लिए लॉगर आउटपुट को सीमित करता है:

7

आप FakeApplication का उपयोग कर रहे हैं, तो आप कुछ विन्यास की जानकारी दे सकते हैं।

मुझे यह देखकर आश्चर्य हुआ कि सेटिंग "चिपचिपा" है। यदि प्रारंभिक परीक्षण FakeAplplication का उपयोग करता है, तो बाद में परीक्षण जो FakeAplplication का उपयोग नहीं करता है, वही लॉगिंग स्तर का उपयोग करेगा।

4

यदि आप परीक्षण चलाने के लिए एसबीटी का उपयोग कर रहे हैं (जो डिफ़ॉल्ट रूप से खेलता है), तो आप लॉगिंग कॉन्फ़िगरेशन को नियंत्रित करने के लिए परीक्षण कार्य में javaOptions सेट कर सकते हैं।

उदाहरण, परियोजना में/Build.scala:

javaOptions in Test  += "-Dlogger.file=conf/test-logger.xml" 

परीक्षण logger.xml फ़ाइल में वाक्य विन्यास के बारे में यहाँ और अधिक:

http://logback.qos.ch/manual/configuration.html

+1

यह 2.3.2 से काम नहीं करता है। उपरोक्त कोड का उपयोग एक डिफ़ॉल्ट परियोजना में संकलित नहीं होगा। परीक्षण में टेस्टऑप्शन प्राप्त करने के लिए प्रबंधित किया गया = टेस्ट। ऑर्ग्यूमेंट ("- Dlogger.file = conf/test-logger.xml") 'लॉगिंग कॉन्फ़िगर करने के लिए, लेकिन यूनिट परीक्षणों से कोई लॉगिंग नहीं आती है। –

+0

मैंने play को हटाने के लिए जवाब संपादित किया। प्रोजेक्ट जो 2.3.x में हटा दिया गया है, लेकिन शेष अभी भी काम करता है - हम वर्तमान में इसे हमारी परियोजना में उपयोग कर रहे हैं। आपके test-logger.xml में आपके पास क्या है? – jazmit

+0

यह अब काम करता है कि आपने 'play.Project' को हटा दिया है। अद्यतन @ jamesinchina के लिए धन्यवाद –

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