2012-01-01 4 views
14

Muchos desarrolladores de iOS han encontrado el Cocoa Lumberjack Logging framework para llenar una necesidad que las declaraciones simples NSLog no lo hacen. Es una reminiscencia de Log4J en el mundo de Java.Informes de registro de descarga inmediata utilizando el marco de registro Cocoa Lumberjack, la forma en que NSLog se va a la consola

En cualquier caso, he escrito mi propio formateador personalizado para Lumberjack, pero lo que no veo es documentación sobre cómo vaciar las declaraciones de registro de inmediato.

Por ejemplo, si estoy caminando a través del depurador y llego a una instrucción NSLog(), vacía inmediatamente la instrucción de registro en la consola. Ese es el comportamiento que me gustaría obtener de una llamada DDLogVerbose() en Lumberjack.

En este momento, vuelvo y cambio estas declaraciones a NSLog() declaraciones si quiero que salgan inmediatamente cuando estoy depurando un segmento de código. Con Lumberjack siendo tan robusto, tengo que pensar que hay una forma de configurarlo para que se descargue sin demora.

¿Alguien sabe cómo hacerlo?

Respuesta

27

Encontré la respuesta en el archivo DDLog.h. Leñador tiene el concepto de registro asincrónico y sincrónico. En la lectura inicial, no me di cuenta de para qué era esto.

Básicamente, si desea que la declaración de registro se emita en secuencia, es necesario sincronizarla (aunque, como mencionó Mike, esto ralentizará el rendimiento). Entonces, esto solo debería hacerse en una situación de depuración. Idealmente, pondré otro encabezado y/o alguna otra macro del preprocesador para asegurarme de no dejar el interruptor activado como sincrónico.

Esto es lo que hace:

  1. Abre DDLog.h
  2. Ir a la línea con #define LOG_ASYNC_ENABLED YES. Puede cambiar esto a NO en un solo lugar para el registro sincrónico en general, o puede cambiar los niveles individuales, en las líneas que siguen.

Tenga en cuenta que el encabezado desalienta el cambio del archivo DDLog.h. Por lo tanto, siguiendo las instrucciones en la página de wiki de Lumberjack link, explican cómo usar un archivo de encabezado diferente para articular estas personalizaciones de anulación.

Usando esto, aquí es lo que he escrito y probado con éxito, como archivo "MyAppLumberjack.h" encabezado que puedo importar en el encabezado precompilado de mi aplicación:

#import "DDLog.h" 
#import "DDASLLogger.h" 
#import "DDTTYLogger.h" 

// ========================= Overrides ======================================== 
// --> per https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomLogLevels 
// ---------------------------------------------------------------------------- 

// Are we in an optimized (i.e. Release) build? 
#ifdef __OPTIMIZE__ 
    // YES: Nothing to do from the default. (You could simplify this by using #ifndef above instead) 
#else 
    // NO: We're in a Debug build. As such, let's configure logging to flush right away. 
    // Undefine the asynchronous defaults: 
    #undef LOG_ASYNC_VERBOSE 
    #undef LOG_ASYNC_INFO 
    #undef LOG_ASYNC_WARN 

    // Define the logs levels to be synchronous: 
    #define LOG_ASYNC_VERBOSE (NO && LOG_ASYNC_ENABLED) // Debug logging will be synchronous 
    #define LOG_ASYNC_INFO  (NO && LOG_ASYNC_ENABLED) // Info logging will be synchronous 
    #define LOG_ASYNC_WARN  (NO && LOG_ASYNC_ENABLED) // Warn logging will be synchronous 
#endif 
0

puede intentar agregar fflush(stderr); en la parte inferior de if (logMsg) en la función - (void)logMessage:(DDLogMessage *)logMessage en DDTTYLogger.m.

La desventaja de enrojecer en cada mensaje de registro es que puede experimentar un golpe al rendimiento, aunque si lo está utilizando para la depuración probablemente no importe.

+0

Gracias Mike. Esta fue una suposición sensata. Desafortunadamente no funcionó. Intenté eliminar el stdout también, pero tampoco funcionó (lo cual tiene sentido; todo el método parece estar generando salida para stderr). – idStar

1

puede esperar a que la cola de registro para terminar con un tiempo de espera:

- (void)waitForLog { 
    dispatch_semaphore_t sema = dispatch_semaphore_create(0); 
    dispatch_async(DDLog.loggingQueue, ^{ 
    dispatch_semaphore_signal(sema); 
    }); 
    dispatch_semaphore_wait(sema, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC))); 
} 
Cuestiones relacionadas