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

Как фильтровать вывод консоли в Xcode

В моем проекте iOS я использую одну стороннюю библиотеку, которая является невероятным спамом в консольном выпуске. Могу ли я применить фильтрацию для отладки вывода.

4b9b3361

Ответ 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.