Turn off console logging for specific objects

后端 未结 3 978
执笔经年
执笔经年 2020-12-31 09:49

It\'s some kind of annoying: Since I started using the MPMoviePlayerController the console is overfilled with information from MPAVController. Eg:

[MPAVCon         


        
3条回答
  •  忘掉有多难
    2020-12-31 10:26

    I don't think such filtering is possible out of the box. But it's possible to redirect stderr (which is used by NSLog) into a pipe, read from that pipe in a background thread and then print messages that pass through the filter onto stdout (which is captured by the debugger as well). This code does the job:

    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
    }
    

    Please note that this code is quite simple and doesn't handle all corner cases. First of all it captures all stderr output and not just NSLog. Maybe this could be filtered out by checking against the content. NSLog output always starts with the date and time.

    Second problem with this code is that it doesn't try to split/join strings it reads from the pipe. There's no guarantee that there will be one NSLog per read. They could be coming together or be too long and would be split. To handle this it would require additional processing of the data read from the pipe.

    Anyway, for many practical purposes this should be enough.

提交回复
热议问题