2012-07-05 65 views
2

我想重定向所有NSLog输出,以便能够在应用程序内部的UITextView中查看我所有的日志(用于调试目的,也许以后会使用TestFlight记录所有内容)。我不能使用众所周知的DLog,因为我想从我不拥有的框架中捕获日志。在设备上忽略NSLog

我正在通过将'stderr'重定向到管道并从此管道中读取来完成此操作。 无论如何,当应用程序从Xcode中启动时,这在模拟器和设备上运行良好。 但是,当应用程序在设备上“手动”启动时,这不起作用。

看来,NSLog调用对设备没有影响:我没有从管道读取任何东西。但是,如果我手动写入stderr:fprintf(stderr, "test")我可以从管道读取它,所以问题不在于stderr,而是在NSLog函数中。

为什么它在设备上什么都不做?有没有办法让它写在stderr上甚至在设备上?

如果无法在设备上使用NSLog,还有另一种从外部框架收集日志的方法吗?

谢谢。

+0

我的印象是,除非它通过一个调试运行的NSLog输出不被处理。很明显,手动启动应用程序时没有调试器,但在模拟器中启动应用程序。在生产环境中,即在设备上运行时,NSLog占用的代码行被有效地忽略。 – 2012-07-05 15:35:33

+0

您可以通过使用Organizer查看设备来访问NSLog输出。 – 2012-07-05 15:41:31

+0

谢谢@DanielHanly。我希望有一种方法可以让设备认为它在“调试环境”中运行。我该如何记录TestFlight上发生的事情呢?热舔:嗯,我想要某种实时日志记录,并且我还需要将日志发送到TestFlight。 – user1504454 2012-07-05 15:47:05

回答

3

NSLog进入系统登录设备。您可以使用C API asl (Apple System Log)访问系统日志;还检查出this blog post

但是,如果您使用的是TestFlight,那么使用TFLog语句替换/追加这些NSLog语句就容易多了。

TFLog(@"This comment is live on TestFlight."); 
+0

这就是我想要的。感谢您的链接。 – user1504454 2012-07-06 08:03:56

0

如果你想要一些UILogging,你可以考虑使用ULOG,一个UIAlertView中基于记录#define指令。

// ULog will show the UIAlertView only when the DEBUG variable is set 

#ifdef DEBUG 
# define ULog(fmt, ...) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"%s\n [Line %d] ", __PRETTY_FUNCTION__, __LINE__] message:[NSString stringWithFormat:fmt, ##__VA_ARGS__] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alert show]; } 
#else 
# define ULog(...) 
#endif 

(来源:http://overbythere.co.uk/blog/2012/01/alternatives-nslog