Я использую предварительно скомпилированную библиотеку, источника которой у меня нет, и она печатает много журналов отладки. Можно ли скрыть вывод только из определенной библиотеки?
Скрытие вывода NSLog из предварительно скомпилированной библиотеки
Ответы (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
и возвращает копию старого файлового дескриптора. Второй перенаправляет его на скопированный дескриптор и закрывает лишнюю копию. Предупреждение. Вам следует проверять возвращаемые значения каждой вызываемой функции, поскольку они сопоставляются с системными вызовами.
NSLog
как макрос с дополнительным аргументом__FILE__
, к сожалению, это повлияло на библиотекуNSLog
. - person A-Live   schedule 27.09.2012