CocoaLumberjack Logarea pe steroizi

Logarea este unul dintre instrumentele cele mai utile pentru inspectarea, înțelegerea și depanarea aplicațiilor iOS și OS X. Probabil sunteți familiarizați cu NSLog funcția oferită de cadrul Fundației, dar ați simțit vreodată nevoia de ceva mai puternic? CocoaLumberjack este o bibliotecă open source creată și întreținută de Robbie Hanson. CocoaLumberjack face logarea la un nivel cu totul nou și în acest tutorial vă voi arăta cum să configurați și să utilizați CocoaLumberjack într-o aplicație iOS.


Logging? Cine are nevoie de logare?

Înregistrarea informațiilor de diagnostic pe o consolă, un fișier sau un server la distanță este utilizată pe scară largă în aproape orice tip de dezvoltare de software. Este una dintre cele mai simple forme de depanare, care este, probabil, de ce este atât de răspândită. Este primul instrument pe care îl folosesc atunci când fac depanări sau încerc să înțeleg o logică complexă indiferent de limbă. Este ușor, rapid, și vine cu foarte puține aeriene.

De ce ar trebui să utilizați CocoaLumberjack dacă tot ceea ce face este să trimiteți bucăți de date în consola sau un fișier? Unul dintre motive este că CocoaLumberjack este (mai ales) mai rapid decât NSLog funcția pe care ni-l oferă cadrul fundației. Datorită numărului de macrocomenzi convenabile oferite de CocoaLumberjack, trecerea de la NSLog la CocoaLumberjack este la fel de ușor ca înlocuirea dvs. NSLog cu DDLog declaraţii.

Un alt avantaj al CocoaLumberjack este acela că o declarație de log poate fi trimisă mai multor loggeri (consola, fișier, baza de date la distanță, etc.). Puteți configura CocoaLumberjack astfel încât să se comporte diferit în funcție de configurația de configurare (Debug, Release, etc.). Există mult mai multe lucruri pe care CocoaLumberjack le poate face pentru a vă permite să vă arăt cum să începeți cu această bibliotecă.


Pasul 1: Setarea CocoaLumberjack

Creați un nou proiect în Xcode selectând Vizualizare individuală șablon din lista de șabloane disponibile (figura 1). Denumiți aplicația Logging, introduceți un identificator al companiei, setați iPhone pentru familia de dispozitive, apoi verificați Utilizați numărarea automată a referințelor. Restul casetelor de selectare pot fi lăsate neschimbate pentru acest proiect (figura 2). Spuneți Xcode unde doriți să salvați proiectul și apăsați pe Crea buton.

Adăugarea bibliotecii CocoaLumberjack la proiectul dvs. este la fel de ușor ca descărcarea ultimei versiuni de la GitHub, extragerea arhivei și tragerea folderului numit Lumberjack în proiectul dvs. Fișierele de bază sunt DDLog.h / .m, DDASLLogger.h / .m, DDTTYLogger.h / .m, și DDFileLogger.h / .m. Celelalte fișiere din folder sunt stubs pentru utilizarea mai avansată a CocoaLumberjack, pe care nu o voi acoperi în acest tutorial. Puteți ignora sau șterge aceste fișiere.

Dacă luați un vârf înăuntru DDLog.h și DDLog.m, este posibil să fiți surprins de numărul de linii de cod din aceste fișiere. După cum am spus, CocoaLumberjack are multe caracteristici utile. CocoaLumberjack este mai puternic decât NSLog deoarece utilizează avantajele multi-threading, Grand Central Dispatch și puterea runtime-ului Obiectiv-C.

Veți observa, de asemenea, că există un număr surprinzător de macrocomenzi definite în DDLog.h. Nu vom folosi majoritatea acestor macrocomenzi. Macroanele pe care le vom folosi în acest tutorial sunt DDLogError, DDLogWarn, DDLogInfo, și DDLogVerbose. Toți îndeplinesc aceeași sarcină, dar fiecare macro este asociat unui nivel de jurnal. Voi vorbi mai multe despre nivelurile de jurnal în câteva momente.

Înainte de a începe să folosim CocoaLumberjack, este o idee bună să adăugați o declarație de import în fișierul antet precompilat al proiectului. Deschis Logging-Prefix.pch și adăugați o declarație de import pentru DDLog.h. Acest lucru asigură că macrocomenzile definite în secțiunea DDLog.h sunt disponibile pe tot parcursul proiectului.

 #import  #ifndef __IPHONE_4_0 #warning "Acest proiect utilizează funcții disponibile numai în SDK 4.0 și ulterior." #endif #ifdef __OBJC__ #import  #import  #import "DDLog.h" #endif

Pasul 2: Adăugarea unui logger

Configurarea CocoaLumberjack este ușor. În primul rând, cu toate acestea, trebuie să importăm mai multe clase din biblioteca CocoaLumberjack. În partea superioară a MTAppDelegate.m, adăugați o declarație de import pentru DDASLLogger.h, DDTTYLogger.h, și DDFileLogger.h (Vezi mai jos). Primele două clase sunt responsabile de trimiterea mesajelor de jurnalizare la aplicația Console (Console.app) și Consola Xcode. DDFileLogger clasa se ocupă de scrierea mesajelor de jurnal într-un fișier de pe disc.

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

În delegatul aplicației aplicare: didFinishLaunchingWithOptions: metoda, adăugăm două înregistrări, după cum se arată mai jos. Ambii DDASLLogger și DDTTYLogger sunt singletons, după cum probabil ați observat. Cu această configurație, vom imita comportamentul NSLog funcția, adică mesajele de jurnal sunt trimise la aplicația Console (Console.app) și la Consola Xcode.

 - (BOOL): aplicație (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Configurați CocoaLumberjack [DDLog addLogger: [DDASLLogger sharedInstance]]; [DDLog addLogger: [DDTTYLogger sharedInstance]]; // Inițializați controlerul de vizualizare self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bundle: nil]; // Initialize fereastra self.window = [[UIWindow alocare] initWithFrame: [[UIScreen mainScreen] limite]]; // Configurați fereastra [auto.window setRootViewController: self.viewController]; [auto.window makeKeyAndVisible]; reveniți DA; 

Acesta este tot ce trebuie să facem pentru a începe cu CocoaLumberjack. Puteți testa acest lucru adăugând următoarele instrucțiuni de jurnal la viewDidLoad metodă a MTViewController clasă. Construiți și rulați proiectul în Simulatorul iOS pentru a vedea dacă totul funcționează conform așteptărilor.

 - (vid) viewDidLoad [super viewDidLoad]; DDLogError (@ "Aceasta este o eroare."); DDLogWarn (@ "Acesta este un avertisment."); DDLogInfo (@ "Acesta este doar un mesaj."); DDLogVerbose (@ "Acesta este un mesaj verbose."); 

Ați dat de asemenea o eroare de compilator? Eroarea compilatorului citește Utilizarea identificatorului nedeclarat "ddLogLevel". Se pare că trebuie să declarăm ddLogLevel înainte de a putea folosi CocoaLumberjack. Aceasta este de fapt o caracteristică a CocoaLumberjack. Prin declararea și atribuirea dinamică a unei valori ddLogLevel putem configura CocoaLumberjack în așa fel încât să se execute declarații de log pe baza configurației de configurare. Pentru a înțelege ce vreau să spun, modificați fișierul antet precompilat al proiectului nostru (Logging-Prefix.pch) așa cum se arată mai jos.

 #import  #ifndef __IPHONE_4_0 #warning "Acest proiect utilizează funcții disponibile numai în SDK 4.0 și ulterior." #endif #ifdef __OBJC__ #import  #import  #import "DDLog.h" #endif #ifdef DEBUG statică const int ddLogLevel = LOG_LEVEL_VERBOSE; # nu statică const int ddLogLevel = LOG_LEVEL_ERROR; # endif

Implicit, CocoaLumberjack definește patru nivele de jurnal, (1) eroare, (2) avertizare, (3) info, și (4) prolix. Definirea nivelurilor de jurnal este foarte frecventă în logarea bibliotecilor (de exemplu, log4j și log4php). Prin atribuirea unui nivel de jurnal unei instrucțiuni de jurnal, aceasta poate fi clasificată, ceea ce este foarte util așa cum veți vedea într-un moment. În fișierul antet precomplicat, declarați ddLogLevel și să le atribuiți o valoare. Valoarea a ddLogLevel determină ce declarații de log sunt executate și care sunt ignorate. Cu alte cuvinte, dacă configurația de construire este egală cu debug (citiți: dacă macro-ul preprocesorului REMEDIERE este definit), atunci ddLogLevel este egal cu LOG_LEVEL_VERBOSE, cel mai înalt nivel al jurnalului. Aceasta înseamnă că fiecare instrucțiune din jurnal va fi executată. Cu toate acestea, dacă configurația de configurare nu este egală cu debug, apoi numai declarații log cu un nivel de jurnal de eroare sunt executate. Este important să știți că nivelurile jurnalului sunt ordonate după cum puteți vedea DDLog.h unde sunt definite.

De ce este util acest lucru? Acesta oferă un mecanism foarte ușor de controlat ce se înregistrează pe baza configurației de configurare. Puteți încerca acest lucru prin modificarea schemei active actuale în Xcode. Opriți aplicația și faceți clic pe schema activă numită Logging din dreapta butonului de oprire (figura 3). Selectați Editați schema ... din meniu și faceți clic pe Rulați înregistrarea în stânga (figura 4). Sub Info filă, setați Construiți configurația la Eliberare (figura 4). Cu această opțiune, selectați configurația de construire pe care Xcode ar trebui să o utilizeze când aplicația rulează în Simulatorul iOS.

Dacă acum construiți și executați proiectul în Simulatorul iOS, ar trebui să vedeți numai instrucțiuni de log cu un nivel de jurnal de eroare tipărite în Consola Xcode. Toate instrucțiunile de jurnal cu un nivel de jurnal mai mare decât eroarea sunt ignorate. Rețineți că REMEDIERE macro-ul preprocesorului este numit CONFIGURATION_DEBUG în Xcode 3. Puteți citi mai multe despre acest lucru pe Wiki-ul CocoaLumberjack.


Pasul 3: Conectarea la un fișier

Logarea la un fișier este o bucată de tort cu CocoaLumberjack. Nu numai că este ușor de configurat, CocoaLumberjack vine cu o serie de opțiuni utile, cum ar fi limitarea mărimii fișierelor fișierelor jurnal și stabilirea unei frecvențe de rulare. Puteți chiar să spuneți CocoaLumberjack pentru a elimina fișierele jurnal vechi, deoarece sunt create fișierele jurnal noi. Permiteți-mi să vă arăt cum funcționează.

Revedeți delegatul aplicației aplicare: didFinishLaunchingWithOptions: și actualizați implementarea acesteia, după cum se arată mai jos. După inițializarea unei instanțe din DDFileLogger, (2) setarea frecvenței de rulare la 24 de ore și (3) stabilirea numărului maxim de fișiere log care trebuie păstrate la șapte. Nu uitați să adăugați jurnalul de fișiere așa cum am făcut-o mai devreme.

 - (BOOL): aplicație (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Configurați CocoaLumberjack [DDLog addLogger: [DDASLLogger sharedInstance]]; [DDLog addLogger: [DDTTYLogger sharedInstance]]; // Inițiați fișierul logger DDFileLogger * fileLogger = [[DDFileLogger alloc] init]; // Configurează loggerul de fișiere [fileLogger setMaximumFileSize: (1024 * 1024)]; [fileLogger setRollingFrequency: (3600.0 * 24.0)]; [[fișierLogger logFileManager] setMaximumNumberOfLogFiles: 7]; [DDLog addLogger: fileLogger]; // Inițializați controlerul de vizualizare self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bundle: nil]; // Initialize fereastra self.window = [[UIWindow alocare] initWithFrame: [[UIScreen mainScreen] limite]]; // Configurați fereastra [auto.window setRootViewController: self.viewController]; [auto.window makeKeyAndVisible]; reveniți DA; 

Înainte de a construi și a rula proiectul, deschideți Finder-ul și căutați în următoarea locație, ~ / Bibliotecă / Suport pentru aplicații / Simulator iPhone // Aplicații // Library / Caches /. După cum puteți vedea, calea poate fi ușor diferită în funcție de versiunea de simulator iOS pe care o utilizați. Rulați aplicația în Simulatorul iOS și inspectați conținutul Caches director. Ar trebui să aibă acum un dosar numit Jurnale conținând un fișier text numit log-XXXXXX.txt. Ultimile șase caractere ale numelui fișierului sunt unice pentru a împiedica suprascrierea fișierelor jurnal. Este posibil să specificați locația unde sunt stocate fișierele jurnal. Ține minte că el Caches directorul poate fi golit de sistemul de operare în orice moment. Dacă doriți să stocați fișierele de jurnale ale aplicației într-o locație mai sigură, vă recomandăm să le stocați în aplicație Documente director.


Bonus: Culori

Chiar dacă culorile par a fi nimic mai mult decât bomboane ochi, fiecare dezvoltator știe cât de importante sunt culorile atunci când lucrează într-un editor de coduri. Cu CocoaLumberjack, puteți adăuga culoarea în Consola Xcode. Robbie Hanson, creatorul CocoaLumberjack, a contribuit, de asemenea, la un plugin Xcode numit Xcode Colors. CocoaLumberjack funcționează foarte bine cu culorile Xcode. Descărcați cea mai recentă versiune a Xcode Colours, extrageți arhiva și puneți conținutul în dosarul plug-in-urilor Xcode (localizat la ~ / Bibliotecă / Suport pentru aplicații / Dezvoltator / Shared / Xcode / Plug-ins /) și reporniți Xcode. Rețineți că este posibil să fie necesar să creați manual directorul plug-in-uri dacă acesta nu este prezent.

Pentru a activa culorile din Consola Xcode, reveniți la aplicare: didFinishLaunchingWithOptions: și spuneți instanța partajată a TTYLogger pentru a permite culorile (a se vedea mai jos). CocoaLumberjack utilizează culori implicite dacă nu specificați o culoare pentru un anumit nivel de jurnal. Suprascrierea setărilor implicite de culoare este ușoară, după cum se arată mai jos. Rulați aplicația în Simulatorul iOS și inspectați fereastra Consolei Xcode pentru a vedea rezultatul (figura 5).

 - (BOOL): aplicație (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Configurați CocoaLumberjack [DDLog addLogger: [DDASLLogger sharedInstance]]; [DDLog addLogger: [DDTTYLogger sharedInstance]]; // Activați culorile [[DDTTYLogger sharedInstance] setColorsEnabled: YES]; [[DDTTYLogger sharedInstance] setForegroundColor: [UICcolor greenColor] fundalColor: nul pentruFlag: LOG_FLAG_INFO]; // Inițiați fișierul logger DDFileLogger * fileLogger = [[DDFileLogger alloc] init]; // Configurează loggerul de fișiere [fileLogger setMaximumFileSize: (1024 * 1024)]; [fileLogger setRollingFrequency: (3600.0 * 24.0)]; [[fișierLogger logFileManager] setMaximumNumberOfLogFiles: 7]; [DDLog addLogger: fileLogger]; // Inițializați controlerul de vizualizare self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bundle: nil]; // Initialize fereastra self.window = [[UIWindow alocare] initWithFrame: [[UIScreen mainScreen] limite]]; // Configurați fereastra [auto.window setRootViewController: self.viewController]; [auto.window makeKeyAndVisible]; reveniți DA; 

Am menționat deja că CocoaLumberjack definește în mod implicit patru niveluri de jurnal. Cu toate acestea, este posibil să se definească nivelurile jurnalului personalizat. Nu voi discuta nivelele jurnalului personalizat în acest tutorial, dar dacă doriți să aflați mai multe despre această caracteristică, vă sugerăm să citiți articolul despre nivelele jurnalului personalizat pe Wiki-ul CocoaLumberjack.

Combinarea culorilor cu nivelurile de jurnal personalizat are ca rezultat un instrument foarte puternic de colectare a datelor și de depanare a unei aplicații. Rețineți că CocoaLumberjack are multe de oferit decât ceea ce am arătat în acest scurt tutorial. Cu CocoaLumberjack, puteți crea înregistrări personalizate, precum și formatori personalizați. Logger-ele personalizate sunt utile în special dacă doriți să vă conectați la o bază de date sau să trimiteți fișiere log pe un server la distanță la intervale regulate de timp. CocoaLumberjack este într-adevăr o bibliotecă puternică care a devenit un instrument indispensabil în setul meu de instrumente.


Concluzie

Logarea datelor de aplicație și a informațiilor de diagnosticare către consola sau un fișier poate fi foarte utilă atunci când se depanează probleme atât în ​​timpul dezvoltării, cât și în timpul producției. Prin urmare, o soluție solidă de exploatare este esențială. Împreună cu mulți alți dezvoltatori, am creat soluții personalizate pentru multe proiecte, dar CocoaLumberjack este un înlocuitor ideal și are multe de oferit.

Cod