CocoaLumberjack registrazione su steroidi

La registrazione è uno degli strumenti più utili per ispezionare, comprendere e eseguire il debug di applicazioni iOS e OS X. Probabilmente hai familiarità con il NSLog funzione fornita dalla struttura della Fondazione, ma hai mai sentito il bisogno di qualcosa di più potente? CocoaLumberjack è una libreria open source creata e gestita da Robbie Hanson. CocoaLumberjack porta la registrazione ad un livello completamente nuovo e in questo tutorial ti mostrerò come configurare e utilizzare CocoaLumberjack in un'applicazione iOS.


Registrazione? Chi ha bisogno di registrazione?

La registrazione delle informazioni diagnostiche su una console, un file o un server remoto è ampiamente utilizzata in quasi tutti i tipi di sviluppo software. È una delle forme più semplici di debugging, che è probabilmente il motivo per cui è così diffusa. È il primo strumento che utilizzo quando eseguo il debug o cerco di comprendere una parte logica complessa indipendentemente dal linguaggio. È facile, veloce e viene fornito con poco overhead.

Perché dovresti usare CocoaLumberjack se tutto ciò che fa è inviare pezzi di dati alla console o a un file? Una ragione è che CocoaLumberjack è (soprattutto) più veloce del NSLog funzione che ci fornisce la struttura della Fondazione. Grazie a una serie di macro convenienti fornite da CocoaLumberjack, passando da NSLog a CocoaLumberjack è facile come sostituire il tuo NSLog con DDLog dichiarazioni.

Un altro vantaggio di CocoaLumberjack è che un'istruzione di registro può essere inviata a più logger (console, file, database remoto, ecc.). Puoi configurare CocoaLumberjack in modo che si comporti in modo diverso a seconda della configurazione di generazione (Debug, Release, ecc.). C'è molto di più che CocoaLumberjack può fare per te, quindi lascia che ti mostri come iniziare con questa nifty library.


Passaggio 1: impostazione di CocoaLumberjack

Crea un nuovo progetto in Xcode selezionando il Applicazione vista singola modello dall'elenco di modelli disponibili (figura 1). Dai un nome alla tua domanda Registrazione, inserire un identificativo aziendale, impostare i phone per la famiglia di dispositivi, quindi controllare Utilizzare il conteggio di riferimento automatico. Il resto delle caselle di controllo può essere lasciato deselezionato per questo progetto (figura 2). Dillo a Xcode dove vuoi salvare il progetto e premi il Creare pulsante.

Aggiungere la libreria CocoaLumberjack al tuo progetto è facile come scaricare l'ultima versione da GitHub, estrarre l'archivio e trascinare la cartella denominata taglialegna nel tuo progetto. I file principali sono DDLog.h / .m, DDASLLogger.h / .m, DDTTYLogger.h / .m, e DDFileLogger.h / .m. Gli altri file nella cartella sono stub per usi più avanzati di CocoaLumberjack, che non tratterò in questo tutorial. Puoi ignorare o eliminare questi file.

Se prendi un picco dentro DDLog.h e DDLog.m, potresti essere sorpreso dal numero di righe di codice in questi file. Come ho detto, CocoaLumberjack ha molte funzioni davvero utili. CocoaLumberjack è più potente di NSLog perché sfrutta il multi-threading, Grand Central Dispatch e la potenza del runtime Objective-C.

Noterai anche che ci sono un numero sorprendente di macro definite in DDLog.h. Non useremo la maggior parte di questi macro. Le macro che useremo in questo tutorial sono DDLogError, DDLogWarn, DDLogInfo, e DDLogVerbose. Tutti eseguono lo stesso compito, ma ogni macro è associata a un livello di registro. Parlerò di più sui livelli di log in pochi istanti.

Prima di iniziare a utilizzare CocoaLumberjack, è consigliabile aggiungere una dichiarazione di importazione al file di intestazione precompilato del progetto. Aperto Registrazione-Prefix.pch e aggiungere una dichiarazione di importazione per DDLog.h. Questo garantisce che le macro definite in DDLog.h sono disponibili per tutto il progetto.

 #importare  #ifndef __IPHONE_4_0 #warning "Questo progetto utilizza funzionalità disponibili solo in iOS SDK 4.0 e versioni successive." #endif #ifdef __OBJC__ #import  #importare  #import "DDLog.h" #endif

Passaggio 2: aggiunta di un logger

Configurare CocoaLumberjack è facile. Innanzitutto, tuttavia, è necessario importare diverse classi della libreria CocoaLumberjack. In cima a MTAppDelegate.m, aggiungi una dichiarazione di importazione per DDASLLogger.h, DDTTYLogger.h, e DDFileLogger.h (vedi sotto). Le prime due classi hanno il compito di inviare messaggi di log all'applicazione Console (Console.app) e alla console di Xcode. Il DDFileLogger class si occupa di scrivere i messaggi di log su un file su disco.

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

Nel delegato dell'applicazione applicazione: didFinishLaunchingWithOptions: metodo, aggiungiamo due logger come mostrato di seguito. Tutti e due DDASLLogger e DDTTYLogger sono singleton come forse hai notato. Con questa configurazione, imitiamo il comportamento di NSLog funzione, ovvero, i messaggi di log vengono inviati all'applicazione Console (Console.app) e alla Console di Xcode.

 - Applicazione (BOOL): applicazione (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Configura CocoaLumberjack [DDLog addLogger: [DDASLLogger sharedInstance]]; [DDLog addLogger: [DDTTYLogger sharedInstance]]; // Initialize View Controller self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bundle: nil]; // Initialize Window self.window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bound]]; // Configure Window [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; return YES; 

Questo è tutto ciò che dobbiamo fare per iniziare con CocoaLumberjack. È possibile verificare questo aggiungendo le seguenti istruzioni di registro al viewDidLoad metodo del MTViewController classe. Costruisci ed esegui il progetto in iOS Simulator per vedere se tutto funziona come previsto.

 - (void) viewDidLoad [super viewDidLoad]; DDLogError (@ "Questo è un errore."); DDLogWarn (@ "Questo è un avviso."); DDLogInfo (@ "Questo è solo un messaggio."); DDLogVerbose (@ "Questo è un messaggio dettagliato."); 

Hai anche incontrato un errore del compilatore? Si legge l'errore del compilatore Utilizzo dell'identificatore non dichiarato 'ddLogLevel'. Sembra che dobbiamo dichiarare ddLogLevel prima di poter utilizzare CocoaLumberjack. Questa è in realtà una funzione di CocoaLumberjack. Dichiarando e assegnando dinamicamente un valore a ddLogLevel possiamo configurare CocoaLumberjack in modo tale che le istruzioni di registro vengano eseguite in base alla configurazione di build. Per capire cosa intendo, modifica il file di intestazione precompilato del nostro progetto (Registrazione-Prefix.pch) come mostrato di seguito.

 #importare  #ifndef __IPHONE_4_0 #warning "Questo progetto utilizza funzionalità disponibili solo in iOS SDK 4.0 e versioni successive." #endif #ifdef __OBJC__ #import  #importare  #import "DDLog.h" #endif #ifdef DEBUG static const int ddLogLevel = LOG_LEVEL_VERBOSE; #else static const int ddLogLevel = LOG_LEVEL_ERROR; #finisci se

Per impostazione predefinita, CocoaLumberjack definisce quattro livelli di registro, (1) errore, (2) avvertimento, (3) Informazioni, e (4) verboso. La definizione dei livelli di registro è molto comune nelle librerie di registrazione (ad esempio, log4j e log4php). Assegnando un livello di registro a un'istruzione di registro, è possibile suddividerlo in categorie, il che è molto utile come vedrete tra poco. Nel file di intestazione precompilato, dichiariamo ddLogLevel e assegnare un valore ad esso. Il valore di ddLogLevel determina quali istruzioni di registro sono eseguite e quali sono ignorate. In altre parole, se la configurazione della build è uguale a mettere a punto (leggi: se la macro del preprocessore DEBUG è definito), quindi ddLogLevel è uguale a LOG_LEVEL_VERBOSE, il più alto livello di registro. Ciò significa che ogni istruzione del registro verrà eseguita. Tuttavia, se la configurazione della build non è uguale a mettere a punto, quindi registra solo le istruzioni con un livello di registro di errore sono eseguiti È importante sapere che i livelli del registro sono ordinati come puoi vedere DDLog.h dove sono definiti.

Perché è utile? Questo fornisce un meccanismo molto semplice per controllare ciò che viene registrato in base alla configurazione di build. Puoi provare questo modificando lo schema attivo corrente in Xcode. Arresta l'applicazione e fai clic sullo schema attivo denominato Registrazione a destra del pulsante di arresto (figura 3). Selezionare Modifica schema ... dal menu e fare clic Eseguire la registrazione a sinistra (figura 4). Sotto il Informazioni scheda, impostare il Costruisci la configurazione a pubblicazione (figura 4). Con questa opzione, si seleziona la configurazione di build che Xcode deve utilizzare quando l'applicazione viene eseguita in iOS Simulator.

Se ora costruisci ed esegui il tuo progetto in iOS Simulator, dovresti vedere solo le dichiarazioni del registro con un livello di registro di errore stampato su Xcode's Console. Tutte le istruzioni di registro con un livello di registro superiore all'errore vengono ignorate. Tieni presente che il DEBUG la macro del preprocessore è denominata CONFIGURATION_DEBUG in Xcode 3. Puoi leggere ulteriori informazioni a riguardo sul Wiki di CocoaLumberjack.


Passaggio 3: registrazione su un file

La registrazione in un file è un gioco da ragazzi con CocoaLumberjack. Non solo è facile da configurare, CocoaLumberjack è dotato di una serie di opzioni utili, come la limitazione della dimensione del file dei file di registro e l'impostazione di una frequenza di rotazione. Puoi anche dire a CocoaLumberjack di rimuovere i vecchi file di registro quando vengono creati nuovi file di registro. Lascia che ti mostri come funziona.

Rivedi i delegati dell'applicazione applicazione: didFinishLaunchingWithOptions: metodo e aggiornare la sua implementazione come mostrato di seguito. Dopo aver inizializzato un'istanza di DDFileLogger, lo configuriamo mediante (1) impostando la dimensione massima del file di ciascun file di registro (in byte), (2) impostando la frequenza di rotolamento su 24 ore e (3) impostando il numero massimo di file di registro che dovrebbero essere tenuti su sette. Non dimenticare di aggiungere il registratore di file come abbiamo fatto in precedenza.

 - Applicazione (BOOL): applicazione (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Configura CocoaLumberjack [DDLog addLogger: [DDASLLogger sharedInstance]]; [DDLog addLogger: [DDTTYLogger sharedInstance]]; // Inizializza File Logger DDFileLogger * fileLogger = [[DDFileLogger alloc] init]; // Configura File Logger [fileLogger setMaximumFileSize: (1024 * 1024)]; [fileLogger setRollingFrequency: (3600.0 * 24.0)]; [[fileLogger logFileManager] setMaximumNumberOfLogFiles: 7]; [DDLog addLogger: fileLogger]; // Initialize View Controller self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bundle: nil]; // Initialize Window self.window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bound]]; // Configure Window [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; return YES; 

Prima di creare ed eseguire il progetto, apri il Finder e vai al seguente percorso, ~ / Libreria / Supporto applicazioni / Simulatore iPhone // Applicazioni // Library / Caches /. Come puoi vedere, il percorso potrebbe essere leggermente diverso a seconda della versione di iOS Simulator che stai utilizzando. Esegui l'applicazione in iOS Simulator e ispeziona il contenuto di caches directory. Ora dovrebbe avere una cartella chiamata logs contenente un file di testo chiamato log-XXXXXX.txt. Gli ultimi sei caratteri del nome file sono univoci per impedire la sovrascrittura dei file di registro. È possibile specificare la posizione in cui sono memorizzati i file di registro. Tieni presente che lui caches la directory può essere svuotata dal sistema operativo in qualsiasi momento. Se si desidera archiviare i file di registro dell'applicazione in un luogo più sicuro, suggerisco di archiviarli nelle applicazioni Documenti elenco.


Bonus: colori

Anche se i colori sembrano niente più che un piacere per gli occhi, ogni sviluppatore sa quanto siano importanti i colori quando si lavora in un editor di codice. Con CocoaLumberjack, puoi aggiungere il colore alla Console di Xcode. Robbie Hanson, il creatore di CocoaLumberjack, ha anche contribuito a un plug-in Xcode denominato Xcode Colors. CocoaLumberjack funziona molto bene con Xcode Colors. Scarica l'ultima versione di Xcode Colors, estrai l'archivio e inserisci il suo contenuto nella cartella dei plug-in di Xcode (situata in ~ / Libreria / Supporto applicazioni / Sviluppatore / Condiviso / Xcode / Plug-in /), e riavviare Xcode. Si noti che potrebbe essere necessario creare manualmente la cartella dei plug-in se non è presente.

Per abilitare i colori nella Console di Xcode, torna al menu applicazione: didFinishLaunchingWithOptions: metodo e dire l'istanza condivisa di TTYLogger classe per abilitare i colori (vedi sotto). CocoaLumberjack utilizza i colori predefiniti se non si specifica un colore per un livello di registro specifico. Sostituire le impostazioni di colore predefinite è facile come mostrato di seguito. Esegui l'applicazione in iOS Simulator e ispeziona la finestra della console di Xcode per vedere il risultato (figura 5).

 - Applicazione (BOOL): applicazione (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Configura CocoaLumberjack [DDLog addLogger: [DDASLLogger sharedInstance]]; [DDLog addLogger: [DDTTYLogger sharedInstance]]; // Abilita colori [[DDTTYLogger sharedInstance] setColorsEnabled: YES]; [[DDTTYLogger sharedInstance] setForegroundColor: [UIColor greenColor] backgroundColor: nil forFlag: LOG_FLAG_INFO]; // Inizializza File Logger DDFileLogger * fileLogger = [[DDFileLogger alloc] init]; // Configura File Logger [fileLogger setMaximumFileSize: (1024 * 1024)]; [fileLogger setRollingFrequency: (3600.0 * 24.0)]; [[fileLogger logFileManager] setMaximumNumberOfLogFiles: 7]; [DDLog addLogger: fileLogger]; // Initialize View Controller self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bundle: nil]; // Initialize Window self.window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bound]]; // Configure Window [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; return YES; 

Ho già detto che CocoaLumberjack definisce quattro livelli di registro per impostazione predefinita. È tuttavia possibile definire livelli di registro personalizzati. Non parlerò dei livelli di log personalizzati in questo tutorial, ma se vuoi saperne di più su questa funzione, ti suggerisco di leggere l'articolo sui livelli di log personalizzati sul Wiki di CocoaLumberjack.

La combinazione di colori con livelli di registro personalizzati si traduce in uno strumento molto potente per raccogliere dati e eseguire il debug di un'applicazione. Tieni presente che CocoaLumberjack ha molto altro da offrire rispetto a quello che ho mostrato in questo breve tutorial. Con CocoaLumberjack, puoi creare logger personalizzati e formattatori personalizzati. I logger personalizzati sono particolarmente utili se si desidera accedere a un database o inviare file di registro a un server remoto a intervalli di tempo regolari. CocoaLumberjack è davvero una potente libreria che è diventata uno strumento indispensabile nella mia cassetta degli attrezzi.


Conclusione

La registrazione dei dati delle applicazioni e delle informazioni diagnostiche sulla console o su un file può essere molto utile durante il debug dei problemi durante lo sviluppo e la produzione. È quindi essenziale disporre di una solida soluzione di registrazione. Insieme a molti altri sviluppatori, ho creato soluzioni di registrazione personalizzate per molti progetti, ma CocoaLumberjack è un sostituto ideale e ha molto altro da offrire.