隐藏来自预编译库的NSLog输出

我正在使用预编译的库,我没有源代码,它打印了很多调试日志。 是否可以隐藏特定库的输出?

不, NSLog将其输出直接写入标准错误,而不检查是否应该。 调用该函数后,将写入输出。

也许您正在使用该库的调试版本。 检查创建它的人是否有,或者他们愿意创建一个无日志版本。

如果在没有记录的情况下无法获得库的版本,则可以将标准错误重定向到/dev/null ,这将导致系统丢弃NSLog输出。 请注意,这需要您使用低级文件描述符,并且您将丢弃所有日志记录的输出,而不仅仅是该库。 您可以通过仅在调用库函数时重定向来最小化丢失的输出,但随后库调用的任何函数或方法也将忽略其日志。 您还可以随时重定向它,除非您正在记录,这意味着所有其他库将丢弃其日志。 由于无法确保不丢弃有用的日志(例如exception消息),因此我不建议对应用程序的调试版本进行任何重定向。

这里重定向和非重定向都可行(请注意,这些也可以作为objective-c方法):

 int discardLogging() { static int discardedOutputFD = -1; if(discardedOutputFD == -1) discardedOutputFD = open("/dev/null", O_WRONLY); int copy = dup(2); // Duplicate the old file descriptor, so it can be restored dup2(discardedOutputFD, 2); // Redirect return copy; } void restartLogging(int copy) { dup2(copy, 2); // Redirect back close(copy); // Not needed anymore } 

第一个函数将标准错误重定向到/dev/null并返回旧文件描述符的副本。 第二个将它重定向到复制的描述符并关闭额外的副本。 警告:您应该检查每个被调用函数的返回值,因为它们映射到系统调用。