Objective c 在设备上忽略NSLog

Objective c 在设备上忽略NSLog,objective-c,ios,device,nslog,Objective C,Ios,Device,Nslog,我正在尝试重定向所有NSLog输出,以便能够在应用程序内部的UITextView中查看我的所有日志(出于调试目的,可能稍后使用TestFlight记录所有日志)。我不能使用著名的DLog,因为我想从我不拥有的框架中捕获日志 我通过将stderr“重定向”到一个管道并从这个管道读取数据来实现这一点。 无论如何,当应用程序从Xcode中启动时,这在模拟器和设备上都能很好地工作。 但是,当应用程序在设备上“手动”启动时,这不起作用 似乎NSLog调用对设备没有影响:我没有从管道中读取任何内容。但是,如

我正在尝试重定向所有NSLog输出,以便能够在应用程序内部的UITextView中查看我的所有日志(出于调试目的,可能稍后使用TestFlight记录所有日志)。我不能使用著名的DLog,因为我想从我不拥有的框架中捕获日志

我通过将stderr“重定向”到一个管道并从这个管道读取数据来实现这一点。 无论如何,当应用程序从Xcode中启动时,这在模拟器和设备上都能很好地工作。 但是,当应用程序在设备上“手动”启动时,这不起作用

似乎NSLog调用对设备没有影响:我没有从管道中读取任何内容。但是,如果我在stderr上手动写入:
fprintf(stderr,“test”)
我可以从管道中读取它,因此问题不在于stderr,而在于NSLog函数

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

如果无法在设备上使用NSLog,是否有其他方法从外部框架收集日志


谢谢。

NSLog转到设备上的系统日志。您可以使用C API访问系统日志;也请查收

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

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

如果您想要一些UIGORG,可以考虑使用ULOG,一个<强> uiAlgtVIEW的< <强>日志}定义指令。

// 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

(来源:)

我的印象是,除非通过调试器运行,否则不会处理NSLog输出。显然,手动启动应用程序时没有调试器,但在模拟器中启动时有调试器。在生产环境(即设备上)中运行时,NSLog占用的代码行实际上会被忽略。您可以通过使用Organizer查看设备来访问NSLog输出。谢谢@DanielHanly。我希望有一种方法可以诱使设备认为它是在“调试环境”中运行的。那么我该如何记录试飞中发生的事情呢?热舔:嗯,我需要某种实时日志记录,而且我还需要将日志发送到TestFlight。我认为NSLog将发送到syslog,而不是stderr。@DanielHanly,在生产环境中它不会被忽略。NSLog将始终输出到设备控制台日志。如果将NSLog包装到宏中,就可以控制调试和发布模式的输出。这就是我想要的。谢谢你的链接。