В моем проекте iOS я использую одну стороннюю библиотеку, которая является невероятным спамом в консольном выпуске. Могу ли я применить фильтрацию для отладки вывода.
Как фильтровать вывод консоли в Xcode
Ответ 1
Работает в Xcode 5.0 до 7.3, Apple больше не поддерживает плагины Xcode с Xcode 8.0.
MCLog должно быть тем, что вы ищете.
Это плагин XCode.
Ответ 2
Если библиотека использует NSLog, вы можете переопределить ее и отбросить сообщение журнала, когда оно поступит из библиотеки. Пример кода:
#define NSLog(args...) [[Logger singleton] debugWithLevel:kDebug line:__LINE__ funcName:__PRETTY_FUNCTION__ message:args];
// poor man nslog
@interface Logger : NSObject
typedef enum {
kTrace=0, kDebug=1, kInfo=2, kWarn=3, kError=4, KSilent=5
} LoggerLevel;
// ...
@implementation Logger
+(Logger *)singleton {
static dispatch_once_t pred;
static Logger *shared = nil;
dispatch_once(&pred, ^{
shared = [[Logger alloc] init];
shared.logThreshold = kTrace;
});
return shared;
}
-(void) debugWithLevel:(LoggerLevel)level
line:(int)line
funcName:(const char *)funcName
message:(NSString *)msg, ... {
va_list ap;
va_start (ap, msg);
msg = [[[NSString alloc] initWithFormat:msg arguments:ap] autorelease];
va_end (ap);
msg = [NSString stringWithFormat:@"%s %50s:%3d - %@", levelName[level], funcName, line, msg];
// ... filter by class name ...
fprintf(stdout,"%s\n", [msg UTF8String]);
}
@end
Обратите внимание, что funcName
содержит имя класса и метод отправки сообщения. Если библиотека является хорошим гражданином и имеет классы, начинающиеся с префикса, отбросьте вывод, если с ним начинается className. В противном случае вам нужно загрузить список классов из этой библиотеки и проверить их перед линией fprintf.
Это, конечно, не дублирует журнал в syslogd, как NSLog, но кто заботится.: P
Ответ 3
Это зависит от того, используете ли вы непосредственно исходный код сторонней библиотеки в своем проекте или двоичную библиотеку.
Если вы используете исходный код, я бы предложил проверить, что они используют для регистрации сообщений. У него может быть способ уменьшить многословие. Если они используют plain NSLog
, единственным вариантом было бы переопределить NSLog
, чтобы сделать некоторую фильтрацию, как предложил Яно.
Если они используют функции низкого уровня, такие как printf
и т.п., ваш лучший вариант - заменить их собственным пользовательским протоколированием, например:
#ifdef DEBUG_3P
#define LOG_3P(str) NSLog(@"%s", str)
#else
#define LOG_3P(str) /* nothing */
#endif
Затем замените printf("a c string message")
на LOG_3P("a c string message")
. Вам нужно будет настроить решение, настроить параметры макроса или добавить несколько макросов для вашего случая. И сделайте несколько поиска и замены до тех пор, пока это не сработает.
Если вы хотите просмотреть журналы сторонних библиотек, просто определите DEBUG_3P
в своих настройках сборки как C flags: -D DEBUG_3P
, иначе он будет отключен.
Если вы используете двоичную библиотеку, вы можете просто создать ее с ее конфигурацией релиза, отключив или уменьшив многословие журналов до минимума.
Ответ 4
Для Swift я написал обертку вокруг print(), которая делает именно это. См. Здесь: https://github.com/SebastianMecklenburg/TagLog
Он работает, добавляя теги для отладки сообщений и затем отфильтровывая вывод этими тегами. Он работает все в коде и не нуждается в плагине Xcode.