2012-10-09 33 views
12

यह किसी प्रकार का परेशान है: चूंकि मैंने MPMoviePlayerController का उपयोग करना शुरू किया है, इसलिए कंसोल MPAVController से जानकारी के साथ ओवरफ़िल हो गया है। उदाहरण के लिए:विशिष्ट ऑब्जेक्ट्स के लिए कंसोल लॉगिंग बंद करें

[MPAVController] Autoplay: _streamLikelyToKeepUp: 1 -> 1 
[MPAVController] Autoplay: Disabling autoplay 

इस की वजह से परेशान मैं हमेशा अपने स्वयं के लॉग की गई जानकारी के लिए खोज करने के लिए है किसी तरह का है। क्या विशिष्ट वस्तुओं या ढांचे के लिए लॉगिंग बंद करने का कोई तरीका है?

उत्तर

10

मुझे नहीं लगता कि इस तरह के फ़िल्टरिंग बॉक्स से बाहर संभव है। लेकिन stderr (जिसे NSLog द्वारा एक पाइप में उपयोग किया जाता है) को रीडायरेक्ट करना संभव है, उस पाइप से पृष्ठभूमि थ्रेड में पढ़ें और फिर stdout पर फ़िल्टर के माध्यम से भेजे गए संदेशों को प्रिंट करें (जिसे डीबगर द्वारा भी पकड़ा जाता है)। यह कोड नौकरी करता है:

int main(int argc, char *argv[]) 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^(void) { 
     size_t const BUFFER_SIZE = 2048; 

     // Create a pipe 
     int pipe_in_out[2]; 
     if (pipe(pipe_in_out) == -1) 
      return; 

     // Connect the 'in' end of the pipe to the stderr 
     if (dup2(pipe_in_out[1], STDERR_FILENO) == -1) 
      return; 

     char *buffer = malloc(BUFFER_SIZE); 
     if (buffer == 0) 
      return; 

     for (;;) 
     { 
      // Read from the 'out' end of the pipe 
      ssize_t bytes_read = read(pipe_in_out[0], buffer, BUFFER_SIZE); 
      if (bytes_read <= 0) 
       break; 

      // Filter and print to stdout 
      if (should_show(buffer)) // TODO: Apply filters here 
       fwrite(buffer, 1, bytes_read, stdout); 
     } 

     free(buffer); 
     close(pipe_in_out[1]); 
    }); 

    // Rest of main 
} 

कृपया ध्यान दें कि यह कोड काफी सरल है और सभी कोने के मामलों को संभाल नहीं करता है। सबसे पहले यह सभी stderr आउटपुट कैप्चर करता है और न केवल NSLog। शायद यह सामग्री के खिलाफ जांच करके फ़िल्टर किया जा सकता है। NSLog आउटपुट हमेशा दिनांक और समय से शुरू होता है।

इस कोड के साथ दूसरी समस्या यह है कि यह पाइप से पढ़ने वाले तारों को विभाजित/जोड़ने की कोशिश नहीं करता है। इस बात की कोई गारंटी नहीं है कि प्रति पढ़ने के लिए NSLog होगा। वे एक साथ आ रहे थे या बहुत लंबे हो सकते हैं और विभाजित हो जाएंगे। इसे संभालने के लिए इसे पाइप से पढ़ने वाले डेटा की अतिरिक्त प्रसंस्करण की आवश्यकता होगी।

वैसे भी, कई व्यावहारिक उद्देश्यों के लिए यह पर्याप्त होना चाहिए।

3

आपको NSLogger पर देखना चाहिए। जबकि एनएसएलओजी आपको रन से चलाने के बारे में कोई भी चुनिंदाता नहीं देता है, एनएसएलओगर कर सकते हैं। एनएसएलओगर ओएस एक्स में अपनी खिड़की में डिवाइस (या सिम्युलेटर) से आउटपुट प्रदर्शित करता है।

असल में यह सुविधा और उत्पादन के स्तर की अवधारणा को जोड़ता है। यूनिक्स विज़ार्ड को इस तुलना के साथ गलती मिल सकती है लेकिन मैं इसे syslog के समान ही देखता हूं। एनएसएलओगर दर्शक आपको एक या अधिक सुविधाओं (जिसे आप परिभाषित करते हैं) के लिए आउटपुट संदेश प्रदर्शित करने देता है जो आवश्यक न्यूनतम स्तर को भी पूरा करता है।

मैक्रोज़ आउटपुट विंडो में जो देखते हैं उसे परिभाषित करते हैं। यहां एक अंश दिया गया है:

#ifdef DEBUG 
    #define LOG_GENERAL(level, ...) LogMessageF(__FILE__,__LINE__,__FUNCTION__,@"general",level,__VA_ARGS__) 
#else 
    #define LOG_GENERAL(...) do{}while(0) 
#endif 

जब DEBUG बंद है, कोई संदेश दिखाई नहीं देता है। जब, यदि आपके पास कोड में LOG_GENERAL() कथन है और आपका दर्शक सुविधा "सामान्य" प्रदर्शित करने के लिए कॉन्फ़िगर किया गया है और आपका स्तर प्रदर्शित होने के लिए पर्याप्त है, तो आपको एक संदेश मिलता है।

यह अविश्वसनीय रूप से लचीला है और मुझे यह बहुत पसंद है। आपकी परियोजना में जोड़ने में लगभग पांच मिनट लगते हैं। पूर्ण विवरण और डाउनलोड के लिए उपरोक्त लिंक किए गए गिथब पेज पर एक नज़र डालें।

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

+0

धन्यवाद, यह अच्छा है। भविष्य में आसान हो सकता है। –

0

एक और विकल्प, यदि आप इसका उपयोग कर सकते हैं, तो एक सिम्युलेटर या डिवाइस को आईओएस < 6.0 चला रहा है।

5.0 डिवाइस या 5.1 सिम्युलेटर का उपयोग करते समय MPAVController लॉग संदेश मेरे लिए प्रकट नहीं होते हैं। लेकिन वे निश्चित रूप से 6.0 सिम्युलेटर में दिखाई देते हैं।

बेशक किसी को आम तौर पर वर्तमान ओएस का उपयोग करना चाहिए, लेकिन यदि कोई परियोजना के एक वीडियो भारी अनुभाग पर काम कर रहा है, तो उस विशेष सेट पर काम करते समय पहले सिम्युलेटर या डिवाइस को चलाने से यह लॉगिंग सिरदर्द कम करने का एक तरीका है ।

यह कुछ पिछड़ा संगतता परीक्षण भी बोनस के रूप में प्रदान करता है।