2011-10-26 3 views
13

Nel mio progetto iOS, utilizzo una libreria di terze parti, che è incredibile spamming nell'output della console. Posso applicare qualsiasi filtro per eseguire il debug dell'output.Come filtrare l'output della console in Xcode

+1

Potrebbe non essere una soluzione reale ma [MCLog] (https://github.com/yuhua-chen/MCLog) è un plug-in XCode che abilita il filtraggio dell'output. – david

+0

@david Thx, dovrei accettare questo commento come risposta migliore, perché 'MCLog' fa esattamente ciò di cui ho bisogno. – ArtFeel

+0

Ho copiato il mio commento come risposta. – david

risposta

4

Se la libreria utilizza NSLog, è possibile ridefinirlo e scartare il messaggio di registro quando proviene dalla libreria. Esempio di codice:

#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 

Nota che funcName contiene il nome di classe e metodo di invio del messaggio. Se la libreria è un buon cittadino e ha classi che iniziano con un prefisso, elimina l'output se la classeName inizia con quello. Altrimenti devi caricare un elenco di classi da quella libreria e controllarle prima della linea fprintf.

Questo naturalmente non duplica il registro su syslogd come fa NSLog, ma a chi importa. : P

3

Dipende se si sta utilizzando direttamente il codice sorgente della libreria di terze parti nel progetto o una libreria binaria.

Se si utilizza il codice sorgente, suggerirei di controllare che cosa stanno utilizzando per registrare i messaggi. Potrebbe avere un modo per ridurre la verbosità. Se usano semplicemente NSLog, l'unica opzione sarebbe ridefinire NSLog per fare un po 'di filtraggio, come Jano ti ha proposto.

Se si sta utilizzando le funzioni di basso livello come printf e simili, la soluzione migliore è quella di sostituirli con il proprio macro personalizzato di registrazione, come:

#ifdef DEBUG_3P 
    #define LOG_3P(str) NSLog(@"%s", str) 
#else 
    #define LOG_3P(str) /* nothing */ 
#endif 

Poi, sostituire printf("a c string message") con LOG_3P("a c string message"). Dovrai personalizzare la soluzione, regolare i parametri delle macro o persino aggiungere diversi macro per il tuo caso. E fai qualche ricerca e sostituiscila finché non funziona.

Quando si desidera vedere i 3 ° ceppi biblioteca partito, basta definire DEBUG_3P nelle impostazioni di generazione come bandiere C: -D DEBUG_3P, altrimenti sarà muto.

Se si utilizza una libreria binaria, è possibile crearla semplicemente con la sua configurazione di rilascio, disattivando o riducendo la verbosità dei registri al minimo.

+0

Io uso la libreria del codice sorgente scritta in C, e usa printf(), vprintf() e puts() per la registrazione. – ArtFeel

+0

In tal caso, a meno che non li si sostituisca con la propria macro di registrazione, temo che non sia possibile * facilmente * intercettare l'output. Vedi la mia risposta aggiornata. – djromero

3

Per Swift, ho scritto un wrapper attorno a print() che fa proprio questo. Vedi qui: https://github.com/SebastianMecklenburg/TagLog

Funziona aggiungendo tag per eseguire il debug dei messaggi e quindi filtrare l'output di tali tag. Funziona tutto in codice e non ha bisogno di un plugin Xcode.

+0

Questo filtra il testo di terze parti che viene inviato alla console tramite il comando 'print()'? –