Скрытие вывода NSLog из предварительно скомпилированной библиотеки

Я использую предварительно скомпилированную библиотеку, источника которой у меня нет, и она печатает много журналов отладки. Можно ли скрыть вывод только из определенной библиотеки?


person moinudin    schedule 26.09.2012    source источник
comment
Я попытался определить NSLog как макрос с дополнительным аргументом __FILE__, к сожалению, это повлияло на библиотеку NSLog.   -  person A-Live    schedule 27.09.2012
comment
Неа. Если люди, которые написали код, не добавили какой-то тест времени выполнения для обхода ведения журнала, то нет возможности отключить его в скомпилированном модуле. (И они ДОЛЖНЫ использовать свой собственный макрос для ведения журнала, а не NSLog напрямую, чтобы они могли включать и выключать их с помощью флага компиляции.)   -  person Hot Licks    schedule 27.09.2012


Ответы (1)


NSLog записывает свой вывод напрямую в стандартную ошибку, не проверяя, нужно ли это делать. После вызова функции вывод будет записан.

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

Если вы не можете получить версию библиотеки без ведения журнала, вы можете перенаправить свою стандартную ошибку на /dev/null, что приведет к тому, что вывод NSLog будет отброшен системой. Обратите внимание, что для этого вам потребуется возиться с файловыми дескрипторами низкого уровня, и вы отбросите выходные данные из всех журналов, а не только из этой библиотеки. Вы можете свести к минимуму потери вывода, перенаправляя только вызов библиотечных функций, но тогда журналы любой функции или метода, вызываемые библиотекой, также будут игнорироваться. Вы также можете перенаправить его в любое время, за исключением случаев, когда вы ведете журнал, что означает, что журналы всех других библиотек будут удалены. Поскольку невозможно гарантировать, что полезные журналы не будут удалены (например, сообщения об исключениях), я бы не рекомендовал какое-либо перенаправление для отладочной сборки вашего приложения.

Вот перенаправление и перенаправление будут работать (обратите внимание, что они также будут работать как методы Objective-C):

int discardLogging() {
    static int discardedOutputFD = -1;
    if(discardedOutputFD == -1) discardedOutputFD = open("/dev/null", O_WRONLY);
    int copy = dup(2); // Duplicate the old file descriptor, so it can be restored
    dup2(discardedOutputFD, 2); // Redirect
    return copy;
}

void restartLogging(int copy) {
    dup2(copy, 2); // Redirect back
    close(copy); // Not needed anymore
}

Первая функция перенаправляет стандартную ошибку на /dev/null и возвращает копию старого файлового дескриптора. Второй перенаправляет его на скопированный дескриптор и закрывает лишнюю копию. Предупреждение. Вам следует проверять возвращаемые значения каждой вызываемой функции, поскольку они сопоставляются с системными вызовами.

person ughoavgfhw    schedule 26.09.2012
comment
Проблема в том, что рассматриваемая библиотека работает в фоновом потоке, в противном случае ваше решение для сброса/перезапуска было бы идеальным. Мы попросили разработчиков удалить вывод отладочной информации, и они сказали, что рано или поздно это сделают, но сейчас это мешает нам. - person moinudin; 27.09.2012