2012-03-08 14 views
23

पर मैं फ़ाइल में NSog() को रीडायरेक्ट करना चाहता हूं, लेकिन फिर भी कंसोल में आउटपुट देखने के लिए। मुझे पता है कि stderr का उपयोग कर फाइल करने के लिए पुनः निर्देशित किया जा सकता हूँ:NSLog() दोनों कंसोल और फ़ाइल

freopen("file.log", "a+", stderr); 

लेकिन यह पुनः निर्देशित दायर करने के लिए के बाद, लॉग कोई और अधिक सांत्वना उत्पादन में दिखाया गया है।

मैं NSLog() के आसपास एक कस्टम रैपर बना सकता हूं लेकिन ऐप क्रैश के पल में stderr पर लॉग इन क्रैश लॉग नहीं मिलेगा।

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

इसी प्रकार के प्रश्नों को यहाँ कहा गया था: Write stderr on iPhone to both file and console लेकिन स्वीकार किए जाते हैं जवाब के बिना, या सुझाव एक NSLog() आवरण का उपयोग करने के साथ।

क्या किसी को इस काम को प्रबंधित करने के बारे में कोई विचार है? अग्रिम में Thanx।

अद्यतन: पुन: निर्देशित का सबसे महत्वपूर्ण हिस्सा प्रणाली त्रुटि लॉग (stderr) दोनों कंसोल और फाइल करने के लिए लिखा है।

+0

यदि आप दो अलग-अलग लॉग करते हैं, तो फ़ाइल में एक भेजें, और एक को कंसोल करने के लिए, लेकिन उन्हें वही रखें? – JTApps

+0

आप इसे प्रबंधित करने का सुझाव कैसे देते हैं? सबसे महत्वपूर्ण बात यह है कि सिस्टम कंसोल लॉग दोनों कंसोल और फ़ाइल में लिखे गए हैं। कंसोल पर डिफॉल्ट लॉग द्वारा –

+2

'NSLog', शायद आप वहां से अपने लॉग निकाल सकते हैं http://stackoverflow.com/questions/7150849/how-can-i-get-a-console-readout-at-runtime-in -an-application/7151773 # 7151773 – Joe

उत्तर

8

According to the docs, आपको एक कस्टम लॉग सुविधा की आवश्यकता होगी।

आप कम से कम जरूरत है, एक समारोह है कि NSLog और fprintf, की तरह कुछ करने के लिए variadic तर्कों और printd लेता है:

void myLog(NSString* format, ...) 
{ 
    va_list argList; 
    va_start(argList, format); 
    NSString* formattedMessage = [[NSString alloc] initWithFormat: format arguments: argList]; 
    va_end(argList); 
    NSLog(@"%@", formattedMessage); 
    fprintf(myFileDescriptor, "%s\n", [formattedMessage UTF8String]); 
    [formattedMessage release]; // if not on ARC 
} 

या वहां कोको प्रवेश चौखटे हैं।

Looking for a Specific Cocoa Logging Framework

+0

का उपयोग था, यह अच्छा है, लेकिन मेरा अद्यतन प्रश्न देखें। मैं कंसोल और फ़ाइल दोनों के लिए सिस्टम के stderr लॉग प्राप्त करने के लिए कुछ रास्ता तलाश रहा हूं, न केवल मेरे कस्टम लॉग। धन्यवाद। –

+0

@ मिरोस्लाव: मुझे नहीं लगता कि मैंने जो कुछ भी आपको दिया है उसके समान बदलाव के बिना संभव है। – JeremyP

25

जिस तरह से हम लागू कर दिया है है:

if (!isatty(STDERR_FILENO)) { 
    // Redirection code 
} 

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

+0

बहुत बढ़िया! मुझे ठीक इसी की आवश्यकता थी! धन्यवाद सेलेश। –

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