2012-01-01 21 views
14

को कंसोल करने के लिए फ्लश करता है। कई आईओएस डेवलपर्स को को NSLog कथन की आवश्यकता को भरने के लिए Cocoa Lumberjack Logging framework मिल गया है। यह जावा दुनिया में Log4J की याद दिलाता है।कोको लंबरजैक लॉगिंग फ्रेमवर्क का उपयोग करके त्वरित रूप से लॉग स्टेटमेंट फ़्लश करना, एनएसएलओजी

किसी भी घटना में, मैंने लंबरजैक के लिए अपना स्वयं का कस्टम फॉर्मेटर लिखा है, लेकिन जो मैं नहीं देखता वह लॉग बयान को तुरंत फ़्लश करने के तरीके पर कोई दस्तावेज है।

उदाहरण के लिए, यदि मैं डीबगर के माध्यम से चल रहा हूं और मैंने NSLog() कथन दबाया है, तो यह लॉग कथन तुरंत कंसोल पर फहराता है। यही वह व्यवहार है जिसे मैं DDLogVerbose() लंबरजैक में कॉल करना चाहता हूं।

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

कोई भी इसे कैसे बनाना है?

उत्तर

27

मुझे DDLog.h फ़ाइल में उत्तर मिला। Lumberjack एसिंक्रोनस और तुल्यकालिक लॉगिंग की अवधारणा है। प्रारंभिक पढ़ने पर, उसने मुझे यह नहीं मारा कि यह क्या था।

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

  1. ओपन अप DDLog.h
  2. जाओ #define LOG_ASYNC_ENABLED YES के साथ लाइन करने के लिए:

    यहाँ आप क्या करना है। आप बोर्ड में सिंक्रोनस लॉगिंग के लिए इसे एक स्थान पर NO पर बदल सकते हैं, या आप अनुसरण की जाने वाली पंक्तियों में व्यक्तिगत स्तर बदल सकते हैं।

ध्यान दें कि हेडर डीडीएलओजीएच फ़ाइल को स्वयं बदलता है। इसलिए, Lumberjack विकी पेज link पर दिए गए निर्देशों का पालन करते हुए, वे बताते हैं कि इन ओवरराइड अनुकूलन को स्पष्ट करने के लिए एक अलग शीर्षलेख फ़ाइल का उपयोग कैसे करें।

#import "DDLog.h" 
#import "DDASLLogger.h" 
#import "DDTTYLogger.h" 

// ========================= Overrides ======================================== 
// --> per https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomLogLevels 
// ---------------------------------------------------------------------------- 

// Are we in an optimized (i.e. Release) build? 
#ifdef __OPTIMIZE__ 
    // YES: Nothing to do from the default. (You could simplify this by using #ifndef above instead) 
#else 
    // NO: We're in a Debug build. As such, let's configure logging to flush right away. 
    // Undefine the asynchronous defaults: 
    #undef LOG_ASYNC_VERBOSE 
    #undef LOG_ASYNC_INFO 
    #undef LOG_ASYNC_WARN 

    // Define the logs levels to be synchronous: 
    #define LOG_ASYNC_VERBOSE (NO && LOG_ASYNC_ENABLED) // Debug logging will be synchronous 
    #define LOG_ASYNC_INFO  (NO && LOG_ASYNC_ENABLED) // Info logging will be synchronous 
    #define LOG_ASYNC_WARN  (NO && LOG_ASYNC_ENABLED) // Warn logging will be synchronous 
#endif 
0

आप के नीचे के नीचे - (void)logMessage:(DDLogMessage *)logMessage फ़ंक्शन DDTTYLogger.m में जोड़ने का प्रयास कर सकते हैं।

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

+0

धन्यवाद माइक। यह एक समझदार supposition था। दुर्भाग्य से यह काम नहीं किया। मैंने stdout भी flushing करने की कोशिश की, लेकिन यह या तो काम नहीं किया (जो समझ में आता है - पूरी विधि stderr के लिए उत्पादन का निर्माण लगता है)। – idStar

1

आप लॉगिंग कतार समाप्त होने की प्रतीक्षा कर सकते हैं:

कि सहायता से देखें कि मैं क्या सफलतापूर्वक लिखा है और परीक्षण किया है, के रूप में "MyAppLumberjack.h" हेडर फाइल है कि मैं अपने एप्लिकेशन की precompiled शीर्ष लेख में आयात है एक टाइमआउट के साथ:

- (void)waitForLog { 
    dispatch_semaphore_t sema = dispatch_semaphore_create(0); 
    dispatch_async(DDLog.loggingQueue, ^{ 
    dispatch_semaphore_signal(sema); 
    }); 
    dispatch_semaphore_wait(sema, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC))); 
}