【问题标题】:Hiding NSLog output coming from precompiled library隐藏来自预编译库的 NSLog 输出
【发布时间】:2012-09-26 19:27:18
【问题描述】:

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

【问题讨论】:

  • 我试图将NSLog 定义为带有额外__FILE__ 参数的宏,不幸的是,这似乎必须影响NSLog 的库。
  • 不。除非编写代码的人添加了某种运行时测试来绕过日志记录,否则无法在已编译的模块中将其关闭。 (并且他们应该使用自己的宏进行日志记录,而不是直接使用 NSLog,以便他们可以使用编译标志打开和关闭它们。)

标签: objective-c ios nslog


【解决方案1】:

没有。 NSLog 直接将其输出写入标准错误,而不检查它是否应该。一旦函数被调用,输出就会被写入。

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

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

这里是重定向和取消重定向可以工作(注意这些也可以作为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 并返回旧文件描述符的副本。第二个将其重定向到复制的描述符并关闭额外的副本。警告:您应该检查每个被调用函数的返回值,因为它们映射到系统调用。

【讨论】:

  • 问题是有问题的库在后台线程中运行,否则您的丢弃/重新启动解决方案将是完美的。我们已经要求开发人员删除调试输出,他们说他们最终会这样做,但现在它妨碍了我们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多