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

mar*_*cog 5 objective-c nslog ios

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

ugh*_*fhw 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
}
Run Code Online (Sandbox Code Playgroud)

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

  • 问题是有问题的库在后台线程中运行,否则您的丢弃/重新启动解决方案将是完美的。我们已经要求开发人员删除调试输出,他们说他们最终会删除,但现在它妨碍了我们。 (2认同)