我正在使用一个我没有源代码的预编译库,它正在打印很多调试日志。是否可以仅隐藏特定库的输出?
问问题
849 次
1 回答
2
No.NSLog
将其输出直接写入标准错误,而不检查它是否应该。调用函数后,将写入输出。
也许您正在使用该库的调试版本。与创建它的人核实,看看是否有,或者他们愿意创建一个无日志版本。
如果没有记录就无法获得库的版本,则可以将标准错误重定向到/dev/null
,这将导致NSLog
输出被系统丢弃。请注意,这需要您处理低级文件描述符,并且您将丢弃所有日志记录的输出,而不仅仅是该库。您可以通过仅在调用库函数时重定向来最小化丢失的输出,但是库调用的任何函数或方法也将忽略其日志。您也可以随时重定向它,除非您正在记录,这意味着所有其他库都将丢弃它们的日志。由于无法确保不丢弃有用的日志(如异常消息),因此我不建议对应用程序的调试版本进行任何重定向。
这是重定向和取消重定向将起作用(请注意,这些也可以用作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
并返回旧文件描述符的副本。第二个将其重定向到复制的描述符并关闭额外的副本。警告:您应该检查每个调用的函数的返回值,因为它们映射到系统调用。
于 2012-09-26T22:57:49.187 回答