这有点烦人:自从我开始使用 MPMoviePlayerController 以来,控制台中充满了来自 MPAVController 的信息。例如:
[MPAVController] Autoplay: _streamLikelyToKeepUp: 1 -> 1
[MPAVController] Autoplay: Disabling autoplay
这有点烦人,因为我总是必须搜索自己的记录信息。有没有办法关闭特定对象或框架的日志记录?
这有点烦人:自从我开始使用 MPMoviePlayerController 以来,控制台中充满了来自 MPAVController 的信息。例如:
[MPAVController] Autoplay: _streamLikelyToKeepUp: 1 -> 1
[MPAVController] Autoplay: Disabling autoplay
这有点烦人,因为我总是必须搜索自己的记录信息。有没有办法关闭特定对象或框架的日志记录?
我认为这种过滤不可能开箱即用。但是可以将stderr
(由 使用NSLog
)重定向到管道中,在后台线程中从该管道中读取,然后将通过过滤器的消息打印到stdout
(也由调试器捕获)。这段代码完成了这项工作:
int main(int argc, char *argv[])
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^(void) {
size_t const BUFFER_SIZE = 2048;
// Create a pipe
int pipe_in_out[2];
if (pipe(pipe_in_out) == -1)
return;
// Connect the 'in' end of the pipe to the stderr
if (dup2(pipe_in_out[1], STDERR_FILENO) == -1)
return;
char *buffer = malloc(BUFFER_SIZE);
if (buffer == 0)
return;
for (;;)
{
// Read from the 'out' end of the pipe
ssize_t bytes_read = read(pipe_in_out[0], buffer, BUFFER_SIZE);
if (bytes_read <= 0)
break;
// Filter and print to stdout
if (should_show(buffer)) // TODO: Apply filters here
fwrite(buffer, 1, bytes_read, stdout);
}
free(buffer);
close(pipe_in_out[1]);
});
// Rest of main
}
请注意,此代码非常简单,并不能处理所有极端情况。首先,它捕获所有stderr
输出,而不仅仅是NSLog
. 也许这可以通过检查内容来过滤掉。NSLog
输出总是以日期和时间开始。
此代码的第二个问题是它不会尝试拆分/连接从管道中读取的字符串。不能保证NSLog
每次阅读都会有一个。他们可能会聚在一起,也可能会太长而分裂。要处理这个问题,需要对从管道读取的数据进行额外处理。
无论如何,对于许多实际目的,这应该足够了。
您应该查看NSLogger。虽然 NSLog 没有给你任何关于你在运行中看到的内容的选择性,但 NSLogger 可以。NSLogger 在 OS X 自己的窗口中显示设备(或模拟器)的输出。
基本上,它将设施和级别的概念添加到输出中。Unix 向导可能会发现这种比较有问题,但我认为它与 syslog 非常相似。NSLogger 查看器允许您显示一个或多个设施(您定义)的输出消息,这些设施也满足所需的最低级别。
宏定义您在输出窗口中看到的内容。这是一段摘录:
#ifdef DEBUG
#define LOG_GENERAL(level, ...) LogMessageF(__FILE__,__LINE__,__FUNCTION__,@"general",level,__VA_ARGS__)
#else
#define LOG_GENERAL(...) do{}while(0)
#endif
当 DEBUG 关闭时,不会出现任何消息。启用时,如果您在代码中有 LOG_GENERAL() 语句,并且您的查看器配置为显示设施“一般”并且您的级别足以显示,您会收到一条消息。
它非常灵活,我非常喜欢它。添加到您的项目大约需要五分钟。请查看上面链接的 github 页面以获取完整的详细信息和下载。
(这并不能解决 MPAVController 用消息填充控制台的问题,但它确实将您想要的消息放在一个新窗口中,从而更容易控制、过滤和解释您感兴趣的内容。)
如果可以使用,另一个选择是运行模拟器或运行 iOS < 6.0 的设备。
使用 5.0 设备或 5.1 模拟器时,我不会显示 MPAVController 日志消息。但它们肯定会出现在 6.0 模拟器中。
当然,通常应该使用当前的操作系统,但如果正在处理项目的视频繁重的部分,则在处理特定任务集的同时运行早期的模拟器或设备是缓解这种日志记录头痛的一种方法。
这也提供了一些向后兼容性测试作为奖励。