2011-09-28 72 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