Rincer immédiatement les instructions du journal à l'aide de la structure de journalisation Cocoa Lumberjack, la façon dont NSLog videra la console

De nombreux développeurs iOS ont trouvé le framework Cocoa Lumberjack Logging pour répondre à un besoin que les simples instructions NSLog ne font pas. Cela callbackle Log4J dans le monde de Java.

Quoi qu'il en soit, j'ai écrit mon propre formateur personnalisé pour Lumberjack, mais ce que je ne vois pas, c'est une documentation sur la façon de vider immédiatement les relevés de journaux.

Par exemple, si je parcours le débogueur et que je NSLog() une NSLog() , l'instruction est immédiatement NSLog() à la console. C'est le comportement que je voudrais get d'un appel DDLogVerbose() dans Lumberjack.

En ce moment, je reviens et change ces instructions en instructions NSLog() si je veux qu'elles crachent immédiatement pendant que je débogue un segment de code. Avec Lumberjack étant si robuste, je dois penser qu'il y a un moyen de configurer pour flush sans timeout.

Quelqu'un sait-il comment le faire?

J'ai trouvé la réponse dans le file DDLog.h . Bûcheron a le concept de la journalisation asynchronous et synchrone. À la lecture initiale, il ne m'a pas frappé quant à ce que c'était.

Fondamentalement, si vous voulez que l'instruction log soit sortie en séquence, il faut la synchroniser (bien que, comme Mike l'a mentionné, cela ralentisse les performances). Donc, cela ne devrait être fait que dans une situation de debugging. Idéalement, je mettrai un autre en-tête set et / ou une autre macro de pré-processeur pour m'assurer que je ne laisse pas l'interrupteur allumé comme synchrone.

Voici ce que vous faites:

  1. Ouvrez DDLog.h
  2. Accédez à la ligne avec #define LOG_ASYNC_ENABLED YES . Vous pouvez changer cela en NO pour un logging synchrone à travers le tableau, ou vous pouvez changer les niveaux individuels, dans les lignes qui suivent.

Notez que l'en-tête déconseille de modifier le file DDLog.h lui-même. Ainsi, en suivant les instructions sur le lien de la page du wiki Lumberjack, ils expliquent comment utiliser un file d'en-tête différent pour articuler ces personnalisations de rlocation.

En utilisant cela, voici ce que j'ai réussi à écrire et à tester, en tant que file d'en-tête "MyAppLumberjack.h" que j'importe dans l'en-tête précompilé de mon application:

 #import "DDLog.h" #import "DDASLLogger.h" #import "DDTTYLogger.h" // ========================= Overrides ======================================== // --> per https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomLogLevels // ---------------------------------------------------------------------------- // Are we in an optimized (ie 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 

Vous pouvez attendre la fin de la queue de journalisation avec un timeout d'attente:

 - (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))); } 

vous pouvez essayer d'append fflush(stderr); en bas du if (logMsg) dans le - (void)logMessage:(DDLogMessage *)logMessage fonction logMessage dans DDTTYLogger.m.

L'inconvénient de rincer chaque message de journal est que vous pouvez rencontrer un coup à la performance, si vous l'utilisez pour le debugging, cela n'a probablement pas d'importance.