我正在回答here中的建议,将iOS设备上的NSLog输出重定向到文件,效果很好。问题是它不再出现在设备的控制台中。我真正喜欢的是一种将stderr流传输到控制台和文件的方法。有谁知道怎么做?
答案 0 :(得分:9)
我在另一个帖子(NSLog() to both console and file)上找到了可接受的答案。
提供的解决方案只有在未检测到调试器时才会重定向到文件,如下所示:
if (!isatty(STDERR_FILENO))
{
// Redirection code
}
感谢Sailesh的回答。
答案 1 :(得分:1)
一旦freopen()
文件描述符,您就可以从中读取数据并随意使用。来自this的一些想法对您有用。
您可以将其写回stdout,或尝试直接写入/dev/console
。我从来没有试过在iPhone上打开/dev/console
,但我猜它尽管不在沙箱之外也是可能的。我不确定应用审核流程会如何对待它。
答案 2 :(得分:1)
或者您可以重定向到TCP套接字并在远程telnet客户端上查看。不需要这样的XCode!
基本上:
创建一个调用Obj-C静态方法的标准C函数:
void tcpLogg_log(NSString* fmt, ...) { va_list args; va_start(args, fmt); [TCPLogger tcpLog:fmt :args]; va_end(args); }
静态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]; }
然后在.pch文件中,添加以下行以覆盖NSLog()
{{1}}
当然,处理TCP套接字需要更多细节。工作源代码可在此处获得: https://github.com/driedler/iOS-TCP-Logger/wiki/About