2014-12-02 7 views
19

तो धन्यवाद करने के लिए आसानी से googleable ब्लॉग मैंने कोशिश की:इकाई परीक्षणों में स्पार्क लॉगिंग को दबाने के लिए कैसे?

import org.specs2.mutable.Specification 

class SparkEngineSpecs extends Specification { 
    sequential 

    def setLogLevels(level: Level, loggers: Seq[String]): Map[String, Level] = loggers.map(loggerName => { 
    val logger = Logger.getLogger(loggerName) 
    val prevLevel = logger.getLevel 
    logger.setLevel(level) 
    loggerName -> prevLevel 
    }).toMap 

    setLogLevels(Level.WARN, Seq("spark", "org.eclipse.jetty", "akka")) 

    val sc = new SparkContext(new SparkConf().setMaster("local").setAppName("Test Spark Engine")) 

    // ... my unit tests 

लेकिन दुर्भाग्य से यह काम नहीं करता, मैं अभी भी चिंगारी उत्पादन का एक बहुत है, जैसे मिलती है:

14/12/02 12:01:56 INFO MemoryStore: Block broadcast_4 of size 4184 dropped from memory (free 583461216) 
14/12/02 12:01:56 INFO ContextCleaner: Cleaned broadcast 4 
14/12/02 12:01:56 INFO ContextCleaner: Cleaned shuffle 4 
14/12/02 12:01:56 INFO ShuffleBlockManager: Deleted all files for shuffle 4 

उत्तर

32

src/test/resources निर्देशिका के अंदर log4j.properties फ़ाइल में निम्न कोड जोड़ें, फ़ाइल बनाने/dir, मैं केवल WARN स्तर लॉग प्राप्त करें, दूसरे शब्दों में INFO स्तर लॉग के साथ कोई और अव्यवस्था नहीं है (हालांकि वे कभी-कभी डिबगिंग के लिए उपयोगी हो सकते हैं)।

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

specs2 – samthebest

+1

धन्यवाद @Emre के साथ एसबीटी के लिए काम करता है। यह intelliJ विचार में जावा के लिए आकर्षण की तरह काम किया। –

2

आप एक अलग Logback उपयोग कर सकते हैं परीक्षण के लिए विन्यास। आपके पर्यावरण के आधार पर यह संभव है कि आपको लॉग को छिपाने वाले कुछ के साथ conf/logback-test.xml बनाना होगा। मुझे लगता है कि यह है कि क्या करना चाहिए:

<configuration> 
    <root level="debug"> 
    </root> 
</configuration> 

मैं यह समझ के रूप में, यह सब लॉग (स्तर debug और उच्च) कब्जा है और उन्हें करने के लिए कोई लकड़हारा प्रदान करती है, तो वे निकाल दिए जाते हैं। एक बेहतर विकल्प उनके लिए एक फ़ाइल लॉगर कॉन्फ़िगर करना है, ताकि आप अभी भी लॉग को एक्सेस कर सकें यदि आप चाहते हैं।

विस्तृत दस्तावेज़ीकरण के लिए http://logback.qos.ch/manual/configuration.html देखें। यदि

# Change this to set Spark log level 
log4j.logger.org.apache.spark=WARN 

# Silence akka remoting 
log4j.logger.Remoting=WARN 

# Ignore messages below warning level from Jetty, because it's a bit verbose 
log4j.logger.org.eclipse.jetty=WARN 

मौजूद नहीं जब मैं अपने इकाई परीक्षण (मैं JUnit और Maven उपयोग कर रहा हूँ) चलाने

+0

उत्तर के लिए धन्यवाद, इसलिए मैंने आपके द्वारा प्रदान की जाने वाली सामग्री के साथ "लॉगबैक-test.xml" नामक "src/test/resource/conf" में एक फ़ाइल जोड़ने का प्रयास किया (स्तर "चेतावनी" के साथ भी प्रयास किया), लेकिन यह था कोई प्रभाव नहीं :( – samthebest

+0

मैं इस सब के बारे में वास्तव में अनिश्चित हूं, क्षमा करें। लेकिन हमारी परियोजना परीक्षण के दौरान फाइल पर लॉग को निर्देशित करती है, इसलिए हमें यह पता लगाने की आवश्यकता है कि यह कैसे स्थापित है :)। 'logback-test.xml'' प्रोजेक्ट रूट>/conf' में है। हमारे स्रोत में फ़ाइल का कहीं भी उल्लेख नहीं किया गया है, इसलिए यह संभवतः एक जादुई डिफ़ॉल्ट स्थान है। मुझे और कुछ नहीं दिख रहा है ... अगर मैं फाइल को हटा देता हूं तो मुझे परीक्षण के दौरान लॉग आउटपुट ('चेतावनी' से) प्राप्त करना शुरू होता है। हम स्केलेटेस्ट का उपयोग करते हैं। –

+1

मैंने इसे 'proj-root/conf/'में कोई भाग्य नहीं डालने का प्रयास किया। मैं थोड़ा उलझन में हूं कि फाइलनाम और न ही सामग्री संदर्भ स्पार्क के बाद से इसे कभी भी चुना जाएगा। इस बीच में मैं वास्तव में हैकी स्क्रिप्ट का उपयोग कर रहा हूं जो कि 'grep -v' को रेगेक्स के साथ करता है जो कि स्पार्क लॉग को हटा देता है। – samthebest

3

एक छोटी सी देर पार्टी के लिए, लेकिन मैं spark example code में यह पाया:

def setStreamingLogLevels() { 
    val log4jInitialized = Logger.getRootLogger.getAllAppenders.hasMoreElements 
    if (!log4jInitialized) { 
     // We first log something to initialize Spark's default logging, then we override the 
     // logging level. 
     logInfo("Setting log level to [WARN] for streaming example." + 
     " To override add a custom log4j.properties to the classpath.") 
     Logger.getRootLogger.setLevel(Level.WARN) 
    } 
} 

मैंने यह भी पाया है कि अपने कोड के साथ अगर आप setLogLevels फोन नीचे की तरह यह मेरे लिए डाल बाहर के बहुत बाहर काट।

setLogLevels(Level.WARN, Seq("spark", "org", "akka")) 
5

रूप में अच्छी तरह स्पार्क लॉग उत्पादन के साथ संघर्ष कर के कुछ समय के बाद, मैं एक समाधान मैं विशेष रूप से पसंद है के साथ एक blog post पाया।

यदि आप slf4j का उपयोग करते हैं, तो कोई भी अंतर्निहित लॉग कार्यान्वयन का आदान-प्रदान कर सकता है। टेस्ट स्कोप के लिए एक अच्छा कैडेट slf4j-nop है, जो लॉग आउटपुट को सावधानीपूर्वक लेता है और इसे रखता है जहां सूर्य कभी चमकता नहीं है।

Maven का उपयोग करते समय आप अपनी निर्भरता सूची में सबसे ऊपर के लिए निम्न जोड़ सकते हैं:

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.7.12</version> 
    <scope>provided</scope> 
</dependency> 

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-nop</artifactId> 
    <version>1.7.12</version> 
    <scope>test</scope> 
</dependency> 

ध्यान दें कि यह सुनिश्चित करने के लिए निर्भरता सूची की शुरुआत में यह है करने के लिए महत्वपूर्ण हो सकता है कि यह देखते हुए कार्यान्वयन उन लोगों के बजाय उपयोग किया जाता है जो अन्य पैकेजों के साथ आ सकते हैं (और जिसे आप अपने वर्ग पथ को साफ रखने और अप्रत्याशित संघर्षों से बचने के लिए बाहर निकलने पर विचार कर सकते हैं)।

+1

यही एकमात्र चीज है जो मेरे लिए काम करती है – Kratos

2

मेरे मामले में मेरे अपने पुस्तकालयों में से एक ने मिश्रण में क्लासिक-क्लासिक लाया।यह शुरू में एक चेतावनी में materialized:

SLF4J: Class path contains multiple SLF4J bindings. 
SLF4J: Found binding in [jar:file:/home/alex/.ivy2/cache/ch.qos.logback/logback-classic/jars/logback-classic-1.1.2.jar!/org/slf4j/impl/StaticLoggerBinder.class] 
SLF4J: Found binding in [jar:file:/home/alex/.ivy2/cache/org.slf4j/slf4j-log4j12/jars/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class] 

मैं निर्भरता से बाहर करके इस हल:

"com.mystuff" % "mylib" % "1.0.0" exclude("ch.qos.logback", "logback-classic") 

अब मैं test/resources जो अब स्पार्क द्वारा इस्तेमाल किया जाता है में एक log4j.properties फ़ाइल जोड़ सकते हैं।

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