CocoaLumberjack Enregistrement sur des stéroïdes

La journalisation est l'un des instruments les plus utiles pour inspecter, comprendre et déboguer des applications iOS et OS X. Vous connaissez probablement le NSLog fonction fournie par le cadre de la Fondation, mais avez-vous déjà ressenti le besoin de quelque chose de plus puissant? CocoaLumberjack est une bibliothèque open source créée et maintenue par Robbie Hanson. CocoaLumberjack prend la journalisation à un tout autre niveau et, dans ce tutoriel, je vais vous montrer comment configurer et utiliser CocoaLumberjack dans une application iOS..


Enregistrement? Qui a besoin de journalisation?

La journalisation des informations de diagnostic sur une console, un fichier ou un serveur distant est largement utilisée dans presque tous les types de développement logiciel. C'est l'une des formes les plus simples de débogage, ce qui explique probablement pourquoi il est si répandu. C'est le premier outil que j'utilise pour déboguer ou essayer de comprendre une logique complexe, quelle que soit la langue. C'est facile, rapide et vient avec très peu de frais généraux.

Pourquoi devriez-vous utiliser CocoaLumberjack si tout ce qu'il fait est d'envoyer des morceaux de données à la console ou un fichier? Une des raisons est que CocoaLumberjack est (généralement) plus rapide que le NSLog fonction que nous fournit le framework Foundation. Grâce à un certain nombre de macros pratiques fournies par CocoaLumberjack, passer de NSLog à CocoaLumberjack est aussi simple que de remplacer votre NSLog avec DDLog des déclarations.

CocoaLumberjack présente un autre avantage: une seule instruction de journal peut être envoyée à plusieurs enregistreurs (console, fichier, base de données distante, etc.). Vous pouvez configurer CocoaLumberjack de telle sorte qu'il se comporte différemment en fonction de la configuration de la construction (Debug, Release, etc.). CocoaLumberjack peut faire beaucoup plus pour vous, alors laissez-moi vous montrer comment commencer avec cette bibliothèque astucieuse.


Étape 1: Configuration de CocoaLumberjack

Créez un nouveau projet dans Xcode en sélectionnant le Application à vue unique modèle de la liste des modèles disponibles (figure 1). Nommez votre application Enregistrement, entrez un identifiant d'entreprise, définissez iPhone pour la famille de périphériques, puis vérifiez Utiliser le comptage automatique des références. Le reste des cases à cocher peut ne pas être coché pour ce projet (figure 2). Indiquez à Xcode où vous souhaitez enregistrer le projet et appuyez sur le bouton Créer bouton.

Ajouter la bibliothèque CocoaLumberjack à votre projet est aussi simple que de télécharger la dernière version à partir de GitHub, d’extraire l’archive et de faire glisser le dossier nommé Bûcheron dans votre projet. Les fichiers de base sont DDLog.h / .m, DDASLLogger.h / .m, DDTTYLogger.h / .m, et DDFileLogger.h / .m. Les autres fichiers du dossier sont des fichiers de remplacement pour des utilisations plus avancées de CocoaLumberjack, que je ne couvrirai pas dans ce didacticiel. Vous pouvez ignorer ou supprimer ces fichiers.

Si vous prenez un pic à l'intérieur DDLog.h et DDLog.m, vous serez peut-être surpris par le nombre de lignes de code contenues dans ces fichiers. Comme je le disais, CocoaLumberjack a beaucoup de fonctionnalités vraiment utiles. CocoaLumberjack est plus puissant que NSLog parce qu'il tire parti du multi-threading, de Grand Central Dispatch et de la puissance du moteur d'exécution Objective-C.

Vous remarquerez également qu’il existe un nombre surprenant de macros définies dans DDLog.h. Nous n'utiliserons pas la majorité de ces macros. Les macros que nous allons utiliser dans ce tutoriel sont DDLogError, DDLogWarn, DDLogInfo, et DDLogVerbose. Ils effectuent tous la même tâche, mais chaque macro est associée à un niveau de journalisation. Je parlerai davantage des niveaux de log dans quelques instants.

Avant de commencer à utiliser CocoaLumberjack, il est judicieux d’ajouter une instruction d’importation au fichier d’en-tête précompilé du projet. Ouvrir Logging-Prefix.pch et ajouter une déclaration d'importation pour DDLog.h. Cela garantit que les macros définies dans DDLog.h sont disponibles tout au long du projet.

 #importation  #ifndef __IPHONE_4_0 #warning "Ce projet utilise des fonctionnalités uniquement disponibles dans iOS SDK 4.0 et versions ultérieures." #endif #ifdef __OBJC__ #import  #importation  #import "DDLog.h" #endif

Étape 2: Ajout d'un enregistreur

Configurer CocoaLumberjack est facile. Cependant, nous devons d’abord importer plusieurs classes de la bibliothèque CocoaLumberjack. Au sommet de MTAppDelegate.m, ajouter une déclaration d'importation pour DDASLLogger.h, DDTTYLogger.h, et DDFileLogger.h (voir ci-dessous). Les deux premières classes sont chargées de l’envoi des messages de journal à l’application Console (Console.app) et à la console Xcode. le DDFileLogger la classe s'occupe d'écrire les messages de log dans un fichier sur le disque.

 #import "MTAppDelegate.h" #import "DDASLLogger.h" #import "DDTTYLogger.h" #import "DDFileLogger.h" #import "MTViewController.h"

Dans le délégué de l'application application: didFinishLaunchingWithOptions: méthode, nous ajoutons deux enregistreurs comme indiqué ci-dessous. Tous les deux DDASLLogger et DDTTYLogger sont des singletons comme vous l'avez peut-être remarqué. Avec cette configuration, nous imitons le comportement du NSLog fonction, c’est-à-dire que les messages de journal sont envoyés à l’application Console (Console.app) et à la console Xcode.

 - Application (BOOL): (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Configurer CocoaLumberjack [DDLog addLogger: [DDASLLogger sharedInstance]]; [DDLog addLogger: [DDTTYLogger sharedInstance]]; // Initialise View Controller self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bundle: nil]; // Initialize Window self.window = [[UIWindow alloc]] initWithFrame: [[UIScreen mainScreen]]]]; // Configurer la fenêtre [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; retourner OUI; 

C'est tout ce que nous avons à faire pour commencer à utiliser CocoaLumberjack. Vous pouvez le tester en ajoutant les instructions de journal suivantes à la viewDidLoad méthode du MTViewController classe. Générez et exécutez le projet dans le simulateur iOS pour voir si tout fonctionne comme prévu.

 - (void) viewDidLoad [super viewDidLoad]; DDLogError (@ "Ceci est une erreur."); DDLogWarn (@ "Ceci est un avertissement."); DDLogInfo (@ "Ceci est juste un message."); DDLogVerbose (@ "Ceci est un message détaillé."); 

Avez-vous également rencontré une erreur de compilation? L'erreur du compilateur lit Utilisation de l'identifiant non déclaré 'ddLogLevel'. Il semble que nous devons déclarer ddLogLevel avant de pouvoir utiliser CocoaLumberjack. C'est en fait une fonctionnalité de CocoaLumberjack. En déclarant et en attribuant dynamiquement une valeur à ddLogLevel nous pouvons configurer CocoaLumberjack de telle sorte que les instructions de journal soient exécutées en fonction de la configuration de construction. Pour comprendre ce que je veux dire, modifiez le fichier d’en-tête précompilé de notre projet (Logging-Prefix.pch) comme indiqué ci-dessous.

 #importation  #ifndef __IPHONE_4_0 #warning "Ce projet utilise des fonctionnalités uniquement disponibles dans iOS SDK 4.0 et versions ultérieures." #endif #ifdef __OBJC__ #import  #importation  #import "DDLog.h" #endif #ifdef DEBUG constante statique int ddLogLevel = LOG_LEVEL_VERBOSE; #else static const int ddLogLevel = LOG_LEVEL_ERROR; #fin si

CocoaLumberjack définit par défaut quatre niveaux de journalisation, (1) Erreur, (2) Attention, (3) Info, et (4) verbeux. La définition de niveaux de journalisation est très courante dans les bibliothèques de journalisation (par exemple, log4j et log4php). En assignant un niveau de journalisation à une instruction de journalisation, celle-ci peut être catégorisée, ce qui est très utile, comme vous le verrez dans un instant. Dans le fichier d'en-tête précompilé, nous déclarons ddLogLevel et lui attribuer une valeur. La valeur de ddLogLevel détermine quelles instructions de journal sont exécutées et lesquelles sont ignorées. En d'autres termes, si la configuration de construction est égale à Déboguer (lire: si la macro du préprocesseur DÉBOGUER est défini), alors ddLogLevel est égal à LOG_LEVEL_VERBOSE, le niveau de log le plus élevé. Cela signifie que chaque instruction de journal sera exécutée. Cependant, si la configuration de construction n’est pas égale à Déboguer, alors que les instructions de journal avec un niveau de journal Erreur sont exécutés. Il est important de savoir que les niveaux de journalisation sont ordonnés comme vous pouvez le voir dans DDLog.h où ils sont définis.

Pourquoi est-ce utile? Cela fournit un mécanisme très simple pour contrôler ce qui est consigné en fonction de la configuration de construction. Vous pouvez essayer cela en modifiant le schéma actif actuel dans Xcode. Arrêtez l'application et cliquez sur le schéma actif nommé Enregistrement à droite du bouton d'arrêt (figure 3). Sélectionner Modifier le schéma… dans le menu et cliquez Exécuter la journalisation à gauche (figure 4). Sous le Info onglet, définissez le Configuration de construction à Libération (figure 4). Avec cette option, vous sélectionnez la configuration de construction que Xcode doit utiliser lorsque l'application s'exécute dans le simulateur iOS..

Si vous créez et exécutez maintenant votre projet dans le simulateur iOS, vous ne devriez voir que les instructions de journal avec un niveau de journalisation égal à. Erreur imprimé sur la console Xcode. Toutes les instructions de journal avec un niveau de journalisation supérieur à error sont ignorées. Gardez à l'esprit que le DÉBOGUER la macro de préprocesseur est nommée CONFIGURATION_DEBUG dans Xcode 3. Vous pouvez en savoir plus à ce sujet sur le Wiki de CocoaLumberjack.


Étape 3: Connexion à un fichier

Se connecter à un fichier est un jeu d'enfant avec CocoaLumberjack. CocoaLumberjack est non seulement facile à configurer, mais il comporte un certain nombre d’options utiles, telles que la limitation de la taille des fichiers journaux et la définition d’une fréquence de roulement. Vous pouvez même dire à CocoaLumberjack de supprimer les anciens fichiers journaux au fur et à mesure que de nouveaux fichiers journaux sont créés. Laissez-moi vous montrer comment cela fonctionne.

Revisiter le délégué de l'application application: didFinishLaunchingWithOptions: méthode et mettre à jour son implémentation comme indiqué ci-dessous. Après avoir initialisé une instance de DDFileLogger, nous le configurons en (1) définissant la taille de fichier maximale de chaque fichier journal (en octets), (2) en définissant la fréquence de défilement sur 24 heures et (3) en définissant le nombre maximal de fichiers journaux devant être conservés à sept. N'oubliez pas d'ajouter l'enregistreur de fichiers comme nous l'avons fait précédemment.

 - Application (BOOL): (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Configurer CocoaLumberjack [DDLog addLogger: [DDASLLogger sharedInstance]]; [DDLog addLogger: [DDTTYLogger sharedInstance]]; // Initialisation du consignateur de fichiers DDFileLogger * fileLogger = [[DDFileLogger alloc] init]; // Configurer le consignateur de fichiers [fileLogger setMaximumFileSize: (1024 * 1024)]; [fileLogger setRollingFrequency: (3600.0 * 24.0)]; [[fileLogger logFileManager] setMaximumNumberOfLogFiles: 7]; [DDLog addLogger: fileLogger]; // Initialise View Controller self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bundle: nil]; // Initialize Window self.window = [[UIWindow alloc]] initWithFrame: [[UIScreen mainScreen]]]]; // Configurer la fenêtre [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; retourner OUI; 

Avant de générer et d'exécuter le projet, ouvrez le Finder et accédez à l'emplacement suivant., ~ / Bibliothèque / Application Support / iPhone Simulator //Applications// Bibliothèque / Caches /. Comme vous pouvez le constater, le chemin peut être légèrement différent selon la version du simulateur iOS que vous utilisez. Exécutez l’application dans le simulateur iOS et inspectez le contenu de la Les caches annuaire. Il devrait maintenant avoir un dossier nommé Les journaux contenant un fichier texte nommé log-XXXXXX.txt. Les six derniers caractères du nom de fichier sont uniques pour empêcher le remplacement des fichiers journaux. Il est possible de spécifier l'emplacement où les fichiers journaux sont stockés. Gardez à l'esprit qu'il Les caches Le répertoire peut être vidé à tout moment par le système d'exploitation. Si vous souhaitez stocker les fichiers journaux de votre application dans un emplacement plus sûr, je vous suggère de les stocker dans le dossier de l'application. Les documents annuaire.


Bonus: Couleurs

Même si les couleurs ne sont rien d’autre que des bonbons pour les yeux, chaque développeur sait à quel point les couleurs sont importantes dans un éditeur de code. Avec CocoaLumberjack, vous pouvez ajouter de la couleur à la console de Xcode. Robbie Hanson, le créateur de CocoaLumberjack, a également contribué à un plugin Xcode appelé Xcode Colors. CocoaLumberjack fonctionne très bien avec Xcode Colors. Téléchargez la dernière version de Xcode Colors, extrayez l’archive et placez son contenu dans le dossier des plug-ins de Xcode (situé à ~ / Bibliothèque / Application Support / Developer / Shared / Xcode / Plug-ins /) et redémarrez Xcode. Notez qu'il peut être nécessaire de créer manuellement le dossier des plug-ins s'il n'est pas présent..

Pour activer les couleurs dans la console Xcode, retournez à la application: didFinishLaunchingWithOptions: méthode et dire l'instance partagée du TTYLogger classe pour activer les couleurs (voir ci-dessous). CocoaLumberjack utilise les couleurs par défaut si vous ne spécifiez pas de couleur pour un niveau de journalisation spécifique. Remplacer les paramètres de couleur par défaut est facile, comme indiqué ci-dessous. Exécutez l'application dans le simulateur iOS et inspectez la fenêtre de la console Xcode pour voir le résultat (figure 5)..

 - Application (BOOL): (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Configurer CocoaLumberjack [DDLog addLogger: [DDASLLogger sharedInstance]]; [DDLog addLogger: [DDTTYLogger sharedInstance]]; // Activer les couleurs [[DDTTYLogger sharedInstance] setColorsEnabled: YES]; [[DDTTYLogger sharedInstance] setForegroundColor: [UIColor greenColor] backgroundColor: nil pourFlag: LOG_FLAG_INFO]; // Initialisation du consignateur de fichiers DDFileLogger * fileLogger = [[DDFileLogger alloc] init]; // Configurer le consignateur de fichiers [fileLogger setMaximumFileSize: (1024 * 1024)]; [fileLogger setRollingFrequency: (3600.0 * 24.0)]; [[fileLogger logFileManager] setMaximumNumberOfLogFiles: 7]; [DDLog addLogger: fileLogger]; // Initialise View Controller self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bundle: nil]; // Initialize Window self.window = [[UIWindow alloc]] initWithFrame: [[UIScreen mainScreen]]]]; // Configurer la fenêtre [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; retourner OUI; 

J'ai déjà mentionné que CocoaLumberjack définit quatre niveaux de journal par défaut. Il est toutefois possible de définir des niveaux de journalisation personnalisés. Je ne parlerai pas des niveaux de journalisation personnalisés dans ce didacticiel, mais si vous souhaitez en savoir plus sur cette fonctionnalité, je vous suggère de lire l'article sur les niveaux de journalisation personnalisés sur le Wiki de CocoaLumberjack..

La combinaison des couleurs avec des niveaux de journal personnalisés donne un outil très puissant pour collecter des données et déboguer une application. Gardez à l’esprit que CocoaLumberjack a beaucoup plus à offrir que ce que j’ai montré dans ce court tutoriel. Avec CocoaLumberjack, vous pouvez créer des enregistreurs personnalisés ainsi que des formateurs personnalisés. Les enregistreurs personnalisés sont particulièrement utiles si vous souhaitez vous connecter à une base de données ou envoyer des fichiers journaux à un serveur distant à des intervalles de temps réguliers. CocoaLumberjack est vraiment une puissante bibliothèque qui est devenue un outil indispensable dans ma boîte à outils.


Conclusion

La consignation des données d'application et des informations de diagnostic sur la console ou un fichier peut s'avérer très utile lors du débogage de problèmes lors du développement et de la production. Avoir une solution de journalisation solide en place est donc essentiel. Avec de nombreux autres développeurs, j'ai créé des solutions de journalisation personnalisées pour de nombreux projets, mais CocoaLumberjack est un remplacement idéal et il a beaucoup plus à offrir..