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
risposta
Funziona in Xcode da 5.0 a 7.3, Apple no longer supports Xcode plug-ins as of Xcode 8.0.
MCLog dovrebbe essere quello che stai cercando.
Questo è un plug-in XCode.
sì ... non funziona più. i problemi di github sono gli stessi e nessuno sembra preoccuparsi –
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
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.
Io uso la libreria del codice sorgente scritta in C, e usa printf(), vprintf() e puts() per la registrazione. – ArtFeel
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
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.
Questo filtra il testo di terze parti che viene inviato alla console tramite il comando 'print()'? –
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
@david Thx, dovrei accettare questo commento come risposta migliore, perché 'MCLog' fa esattamente ciò di cui ho bisogno. – ArtFeel
Ho copiato il mio commento come risposta. – david