Подтвердить что ты не робот

Отключить ведение журнала консоли для определенных объектов

Это какое-то раздражающее: Поскольку я начал использовать MPMoviePlayerController, консоль переполнена информацией из MPAVController. Например:

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

Это что-то вроде раздражающего, потому что я всегда должен искать свою собственную зарегистрированную информацию. Есть ли способ отключить ведение журнала для определенных объектов или фреймворков?

4b9b3361

Ответ 1

Я не думаю, что такая фильтрация возможна из коробки. Но можно перенаправить 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. Они могут собираться вместе или быть слишком длинными и разделяться. Чтобы справиться с этим, потребуется дополнительная обработка данных, считанных с канала.

Во всяком случае, для многих практических целей этого должно быть достаточно.

Ответ 2

Вы должны посмотреть 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 заполняет консоль сообщениями, но она помещает нужные вам сообщения в новое окно, что упрощает управление, фильтрацию и интерпретацию того, что вас интересует.)

Ответ 3

Другой вариант, если вы можете его использовать, - запустить либо симулятор, либо устройство, работающее под управлением iOS < 6,0.

Сообщения журнала MPAVController не отображаются для меня при использовании устройства 5.0 или 5.1-симулятора. Но они определенно появляются в симуляторе 6.0.

Конечно, обычно нужно использовать текущую ОС, но если вы работаете над тяжелой частью видео проекта, запуск более раннего симулятора или устройства во время работы над этим конкретным набором задач - это способ облегчить эту головную боль в журналах.

Это также обеспечивает некоторое тестирование обратной совместимости в качестве бонуса.