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




objective-c xcode (2)

这是一种烦人的:自从我开始使用MPMoviePlayerController控制台过度充满MPAVController的信息。 例如:

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

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


你应该看看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用消息填充控制台的问题,但是它确实把你想要的消息放在一个新的窗口中,使得控制,过滤和解释你感兴趣的东西变得容易得多。)


我不认为这样的过滤是可能的。 但是可以将stderrNSLog所使用的)重定向到一个管道中,在后台线程中从管道中读取,然后将通过过滤器的消息打印到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 。 他们可能会走到一起或者太长,会分裂。 为了处理这个问题,需要额外处理从管道读取的数据。

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





mpmovieplayercontroller