关闭特定对象的控制台日志记录

时间:2012-10-09 16:28:57

标签: iphone objective-c xcode logging mpmovieplayercontroller

这有点烦人: 自从我开始使用MPMoviePlayerController以来,控制台中的MPAVController信息过多。 例如:

[MPAVController] Autoplay: _streamLikelyToKeepUp: 1 -> 1
[MPAVController] Autoplay: Disabling autoplay

这有点烦人,因为我总是要搜索我自己的记录信息。 有没有办法关闭特定对象或框架的日志记录?

3 个答案:

答案 0 :(得分:10)

我不认为这种过滤是开箱即用的。但是可以将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。他们可能会聚在一起或者太长并且会分裂。要处理这个问题,需要额外处理从管道读取的数据。

无论如何,出于许多实际目的,这应该足够了。

答案 1 :(得分:3)

你应该研究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()语句,并且您的查看器配置为显示设施“general”,并且您的级别足以显示,则会收到一条消息。

它非常灵活,我非常喜欢它。大约需要五分钟才能添加到您的项目中。请查看上面链接的github页面以获取完整的详细信息并下载。

(这不会解决MPAVController用消息填充控制台的问题,但它确实将你想要的消息放在一个新窗口中,使得更容易控制,过滤和解释你感兴趣的内容。)

答案 2 :(得分:0)

另一个选项,如果你可以使用它,是运行模拟器或运行iOS的设备&lt; 6.0。

使用5.0设备或5.1模拟器时,不会出现MPAVController日志消息。但它们绝对出现在6.0模拟器中。

当然,人们通常应该使用当前的操作系统,但是如果一个人正在处理项目的视频重要部分,那么在处理该特定任务集时运行早期的模拟器或设备是缓解这种日志记录问题的一种方法。

这也提供了一些向后兼容性测试作为奖励。