Как отфильтровать вывод консоли в Xcode - PullRequest
15 голосов
/ 26 октября 2011

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

Ответы [ 4 ]

5 голосов
/ 26 октября 2011

Если библиотека использует NSLog, вы можете переопределить ее и отбросить сообщение журнала, когда оно поступит из библиотеки. Пример кода:

#define NSLog(args...) [[Logger singleton] debugWithLevel:kDebug line:__LINE__ funcName:__PRETTY_FUNCTION__ message:args];

// poor man's 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 голосов
/ 04 сентября 2015

Работает в Xcode 5.0 до 7.3, Apple больше не поддерживает подключаемые модули Xcode с Xcode 8.0 .

MCLog должен быть тем, что вы ищете.

Это плагин XCode.

3 голосов
/ 26 октября 2011

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

Если вы используете исходный код, я бы посоветовал проверить, что они используют для регистрации сообщений. Это может быть способ уменьшить многословие. Если они используют обычный 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: -D DEBUG_3P, иначе он будет отключен.

Если вы используете бинарную библиотеку, вы можете просто собрать ее с конфигурацией выпуска, отключив или уменьшив детализацию журналов до минимума.

2 голосов
/ 05 июня 2016

Для Swift я написал обертку вокруг print (), которая делает именно это. Смотрите здесь: https://github.com/SebastianMecklenburg/TagLog

Он работает путем добавления тегов к сообщениям отладки, а затем фильтрует выходные данные по этим тегам. Все работает в коде и не нуждается в плагине Xcode.

...