2011-09-28 9 views
9

मैं आईओएस डिवाइस पर एनएसएलओजी आउटपुट को एक फाइल में रीडायरेक्ट करने के लिए here के उत्तर में सुझाव का पालन कर रहा हूं, जो बहुत अच्छा काम करता है। समस्या यह है कि यह डिवाइस पर कंसोल में अब दिखाई नहीं दे रहा है। जो मैं वास्तव में पसंद करूंगा वह कंसोल और फ़ाइल दोनों में stderr स्ट्रीम को टी करने का एक तरीका है। क्या किसी को पता है कि यह कैसे करना है?आईफोन पर फ़ाइल और कंसोल दोनों के लिए stderr लिखें

+0

[NSLog() दोनों कंसोल और फ़ाइल के संभावित डुप्लिकेट] (http://stackoverflow.com/questions/9619708/nslog-to-both-console-and-file) – AechoLiu

उत्तर

8

मुझे एक और थ्रेड (NSLog() to both console and file) पर एक स्वीकार्य उत्तर मिला। कि उत्तर के लिए शैलेश को

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

धन्यवाद:

समाधान प्रदान वहाँ केवल एक फ़ाइल पर रीडायरेक्ट करने अगर एक डिबगर का पता नहीं है, इस तरह है।

+0

अगर हम कथन लिखते हैं तो हमें यह कहां लिखना चाहिए? ऐप प्रतिनिधि में या क्या हमें इसे प्रत्येक दृश्य नियंत्रक में लिखना है? – Max

+0

आपको यह कोड लिखना चाहिए यदि कोड को एन्सेप्लेट करने के लिए कथन जो फ़ाइल में stderr को रीडायरेक्ट करता है। –

1

एक बार जब आप freopen() फ़ाइल डिस्क्रिप्टर के बाद, आप इसे पढ़ सकते हैं और डेटा के साथ कृपया कर सकते हैं। this से कुछ विचार आपके लिए उपयोगी होंगे।

आप या तो इसे वापस स्टडीआउट पर लिख सकते हैं, या सीधे /dev/console पर लिखने का प्रयास कर सकते हैं। मैंने कभी भी आईफोन पर /dev/console खोलने की कोशिश नहीं की है, लेकिन मुझे लगता है कि सैंडबॉक्स के बाहर होने के बावजूद यह संभव है। मुझे यकीन नहीं है कि ऐप समीक्षा प्रक्रिया इसका इलाज कैसे करेगी।

1

या आप एक टीसीपी सॉकेट पर रीडायरेक्ट कर सकते हैं और रिमोट टेलनेट क्लाइंट पर देख सकते हैं। इस तरह XCode के लिए कोई ज़रूरत नहीं है!

मूल रूप से

:

  1. एक मानक सी समारोह जो एक Obj सी स्थिर प्रणाली को बुलाती है बनाएँ:

     
    void tcpLogg_log(NSString* fmt, ...) 
    { 
        va_list args; 
        va_start(args, fmt); 
        [TCPLogger tcpLog:fmt :args]; 
        va_end(args); 
    } 
    
  2. स्थिर Obj सी विधि:

     
    (void)tcpLog:(NSString*)fmt :(va_list)args 
    { 
        NSLogv(fmt, args); 
    
    
    if(sharedSingleton != nil && sharedSingleton.socket != nil) 
    { 
        NSString *time = [sharedSingleton.dateFormat stringFromDate:[NSDate date]]; 
        NSString *msg = [[NSString alloc] initWithFormat:fmt arguments:args]; 
        mach_port_t tid = pthread_mach_thread_np(pthread_self()); 
    
        NSString *str = [NSString stringWithFormat:@"%@[%X]: %@\r\n", time, tid, msg]; 
        NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; 
        [sharedSingleton.socket writeData:data 
              withTimeout:NETWORK_CLIENT_TIMEOUT_PERIOD 
              tag:0];             
    } 
    
    }
  3. फिर अपने .pch फ़ाइल में, NSLog()

     
    define NSLog(...) tcpLogg_log(__VA_ARGS__); 
    void tcpLogg_log(NSString* fmt, ...); 
    

ओवरराइड करने के लिए बेशक अधिक जानकारी के टीसीपी सॉकेट को संभालने के लिए आवश्यक हैं निम्नलिखित पंक्तियाँ जोड़ें। वर्किंग सोर्स कोड यहां उपलब्ध है: https://github.com/driedler/iOS-TCP-Logger/wiki/About

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