2011-10-26 10 views
13

En mi proyecto de iOS, uso una biblioteca de terceros, que es increíble como spam en la salida de la consola. ¿Puedo aplicar cualquier filtrado a la salida de depuración?Cómo filtrar la salida de la consola en Xcode

+1

Puede que no sea una solución real, pero [MCLog] (https://github.com/yuhua-chen/MCLog) es un complemento XCode que permite el filtrado de salida. – david

+0

@david Thx, debería aceptar este comentario como la mejor respuesta, porque 'MCLog' hace exactamente lo que necesito. – ArtFeel

+0

He copiado mi comentario como respuesta. – david

Respuesta

4

Si la biblioteca usa NSLog, puede redefinirla y descartar el mensaje de registro cuando proviene de la biblioteca. Código de ejemplo:

#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 

Tenga en cuenta que funcName contiene el nombre de clase y enviar el mensaje método. Si la biblioteca es un buen ciudadano y tiene clases que comienzan con un prefijo, descarte la salida si el nombre de clase comienza con eso. De lo contrario, debe cargar una lista de clases de esa biblioteca y verificarlas antes de la línea fprintf.

Esto, por supuesto, no duplica el registro en syslogd, como hace NSLog, pero a quién le importa. : P

3

Depende si está utilizando directamente el código fuente de la biblioteca de terceros en su proyecto o una biblioteca binaria.

Si está utilizando el código fuente, le sugiero que verifique qué están usando para registrar los mensajes. Puede tener una forma de reducir la verbosidad. Si están usando plain NSLog, la única opción sería redefinir NSLog para hacer algo de filtrado, como Jano te propuso.

Si están usando funciones de bajo nivel como printf y similares, su mejor opción es reemplazar con su propia macro de registro personalizado, como:

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

A continuación, reemplace printf("a c string message") con LOG_3P("a c string message"). Tendrá que personalizar la solución, ajustar los parámetros de macro o incluso agregar varias macros para su caso. Y haga algunas búsquedas y reemplace hasta que funcione.

Cuando desee ver los registros de la biblioteca de terceros, simplemente defina DEBUG_3P en su configuración de compilación como C flags: -D DEBUG_3P; de lo contrario, se silenciará.

Si está utilizando una biblioteca binaria, puede compilarla con su configuración de lanzamiento, inhabilitando o reduciendo la verbosidad de los registros al mínimo.

+0

Uso la biblioteca de código fuente escrita en C, y usa printf(), vprintf() y puts() para el registro. – ArtFeel

+0

En ese caso, a menos que los reemplace con su propia macro de registro, me temo que no puede * fácilmente * interceptar el resultado. Ver mi respuesta actualizada. – djromero

3

Para Swift, escribí un contenedor alrededor de print() que hace justamente esto. Vea aquí: https://github.com/SebastianMecklenburg/TagLog

Funciona mediante la adición de etiquetas para depurar mensajes y luego filtrar la salida por esas etiquetas. Funciona todo en código y no necesita un complemento de Xcode.

+0

¿Esto filtrará el texto de terceros que se envía a la consola a través del comando 'print()'? –

Cuestiones relacionadas