2011-09-28 40 views
9

我按照回答here中的建議將iOS設備上的NSLog輸出重定向到文件,效果很好。問題是它不再顯示在設備的控制檯上。我真正喜歡的是將stderr流開到控制檯和文件的方式。有沒有人有一個想法如何做到這一點?將iPhone上的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 
} 

感謝Sailesh爲這個問題的答案。

+0

我們應該在哪裏寫這個if語句?在應用程序委託中,還是必須將其寫入每個視圖控制器? – Max

+0

您應該編寫if語句來封裝將stderr重定向到文件的代碼。 –

1

一旦你freopen()的文件描述符,你可以從它讀取和做你喜歡的數據。 this的一些想法對你有用。

您可以將其寫回標準輸出,或嘗試直接寫入/dev/console。我從來沒有試圖在iPhone上打開/dev/console,但我猜儘管在沙箱外面也是可以的。我不確定應用審覈流程如何處理。

1

或者您可以重定向到TCP套接字並在遠程telnet客戶端上查看。這種方式不需要XCode!

基本上:

  1. 創建一個標準的C函數調用一個OBJ-C靜態方法:

     
    void tcpLogg_log(NSString* fmt, ...) 
    { 
        va_list args; 
        va_start(args, fmt); 
        [TCPLogger tcpLog:fmt :args]; 
        va_end(args); 
    } 
    
  2. 靜態的OBJ-C方法:

     
    (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, ...); 
    

當然需要更多的細節來處理TCP套接字。工作的源代碼可以在這裏找到: https://github.com/driedler/iOS-TCP-Logger/wiki/About

相關問題