CocoaLumberjack Logg på steroider

Logging er en av de mest nyttige instrumentene for å inspisere, forstå og feilsøke iOS- og OS X-applikasjoner. Du er sikkert kjent med NSLog Funksjonen fra Foundation-rammen, men har du noen gang følt behov for noe kraftigere? CocoaLumberjack er et open source bibliotek opprettet og vedlikeholdt av Robbie Hanson. CocoaLumberjack tar logging på et helt nytt nivå, og i denne opplæringen vil jeg vise deg hvordan du konfigurerer og bruker CocoaLumberjack i et iOS-program.


Logging? Hvem trenger logging?

Logging av diagnostisk informasjon til en konsoll-, fil- eller ekstern server er mye brukt i nesten alle typer programvareutvikling. Det er en av de enkleste former for feilsøking, noe som sannsynligvis er hvorfor det er så utbredt. Det er det første verktøyet jeg bruker når jeg feiler eller prøver å forstå et komplekst logikk uavhengig av språket. Det er enkelt, raskt, og kommer med svært lite overhead.

Hvorfor skal du bruke CocoaLumberjack hvis alt det gjør er å sende datastykker til konsollen eller en fil? En grunn er at CocoaLumberjack er (for det meste) raskere enn NSLog Funksjonen som Foundation Framework gir oss. Takket være en rekke praktiske makroer som tilbys av CocoaLumberjack, bytter du fra NSLog å CocoaLumberjack er like enkelt som å erstatte din NSLog med DDLog uttalelser.

En annen fordel med CocoaLumberjack er at en loggoppgave kan sendes til flere loggere (konsoll, fil, ekstern database, etc.). Du kan konfigurere CocoaLumberjack på en slik måte at den oppfører seg annerledes avhengig av byggekonfigurasjonen (Debug, Release, etc.). Det er mye mer som CocoaLumberjack kan gjøre for deg, så la meg vise deg hvordan du kommer i gang med dette nifty biblioteket.


Trinn 1: Konfigurere CocoaLumberjack

Opprett et nytt prosjekt i Xcode ved å velge Enkeltvisningsprogram mal fra listen over tilgjengelige maler (figur 1). Navn søknaden din logging, skriv inn en bedriftsidentifikator, sett iPhone for enhetsfamilien, og kontroller deretter Bruk automatisk referansetelling. Resten av avmerkingsboksene kan stå ukontrollert for dette prosjektet (figur 2). Fortell Xcode hvor du vil lagre prosjektet og trykke på Skape knapp.

Å legge til CocoaLumberjack-biblioteket til prosjektet ditt er like enkelt som å laste ned den nyeste versjonen fra GitHub, utvinne arkivet og dra mappen som heter Tømmerhugger inn i prosjektet ditt. Kjernefilene er DDLog.h / .m, DDASLLogger.h / .m, DDTTYLogger.h / .m, og DDFileLogger.h / .m. De andre filene i mappen er stubber for mer avanserte bruksområder av CocoaLumberjack, som jeg ikke vil dekke i denne opplæringen. Du kan ignorere eller slette disse filene.

Hvis du tar en topp inne DDLog.h og DDLog.m, Du kan bli overrasket over antall linjer med kode i disse filene. Som jeg sa, har CocoaLumberjack mange veldig nyttige funksjoner. CocoaLumberjack er kraftigere enn NSLog fordi det tar fordel av multi-threading, Grand Central Dispatch, og kraften i Objective-C runtime.

Du vil også merke at det er et overraskende antall makroer som er definert i DDLog.h. Vi vil ikke bruke flertallet av disse makroene. Makroene som vi skal bruke i denne opplæringen er DDLogError, DDLogWarn, DDLogInfo, og DDLogVerbose. De utfører alle de samme oppgavene, men hver makro er knyttet til et loggnivå. Jeg vil snakke mer om loggnivå i løpet av få minutter.

Før vi begynner å bruke CocoaLumberjack, er det en god idé å legge til en importerklæring i prosjektets forkompilerte headerfil. Åpen Logging-Prefix.pch og legg til en importoppgave for DDLog.h. Dette sikrer at makroene definert i DDLog.h er tilgjengelig gjennom hele prosjektet.

 #importere  #ifndef __IPHONE_4_0 #warning "Dette prosjektet bruker funksjoner som bare er tilgjengelige i iOS SDK 4.0 og nyere." #endif #ifdef __OBJC__ #import  #importere  #import "DDLog.h" #endif

Trinn 2: Legge til en logger

Det er enkelt å konfigurere CocoaLumberjack. Først må vi imidlertid importere flere klasser av CocoaLumberjack-biblioteket. På toppen av MTAppDelegate.m, legg til en importerklæring for DDASLLogger.h, DDTTYLogger.h, og DDFileLogger.h (se nedenfor). De to første klassene har ansvaret for å sende loggmeldinger til konsollprogrammet (Console.app) og Xcode's Console. De DDFileLogger klassen tar seg av å skrive loggmeldinger til en fil på disken.

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

I søknadens delegat s applikasjons: didFinishLaunchingWithOptions: metode, legger vi til to loggere som vist nedenfor. Både DDASLLogger og DDTTYLogger er singletoner som du kanskje har lagt merke til. Med dette oppsettet etterligner vi oppførselen til NSLog funksjon, det vil si, loggmeldinger sendes til konsollprogrammet (Console.app) og Xcode's Console.

 - (BOOL) søknad: (UIApplication *) søknad didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Konfigurer CocoaLumberjack [DDLog addLogger: [DDASLLogger sharedInstance]]; [DDLog addLogger: [DDTTYLogger sharedInstance]]; // Initialiser View Controller self.viewController = [[MTViewController alloker] initWithNibName: @ "MTViewController" bundle: null]; // Initialiser Window self.window = [[UIWindow alloc] initWithFrame: grenser for [[UIScreen mainScreen]]; // Konfigurer Window [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; returnere JA; 

Dette er alt vi må gjøre for å komme i gang med CocoaLumberjack. Du kan teste dette ut ved å legge til følgende loggoppføringer til viewDidLoad metode av MTViewController klasse. Bygg og kjør prosjektet i iOS-simulatoren for å se om alt fungerer som forventet.

 - (void) viewDidLoad [super viewDidLoad]; DDLogError (@ "Dette er en feil."); DDLogWarn (@ "Dette er en advarsel."); DDLogInfo (@ "Dette er bare en melding."); DDLogVerbose (@ "Dette er en verbose melding."); 

Fikk du også inn i en kompilatorfeil? Kompilatorfeilen leser Bruk av svart identifikator 'ddLogLevel'. Det virker som om vi må erklære ddLogLevel før vi kan bruke CocoaLumberjack. Dette er faktisk en funksjon av CocoaLumberjack. Ved å erklære og dynamisk tildele en verdi til ddLogLevel Vi kan konfigurere CocoaLumberjack på en slik måte at log-setninger utføres basert på byggekonfigurasjonen. For å forstå hva jeg mener, må du endre den forkompilerte headerfilen til prosjektet vårt (Logging-Prefix.pch) som vist under.

 #importere  #ifndef __IPHONE_4_0 #warning "Dette prosjektet bruker funksjoner som bare er tilgjengelige i iOS SDK 4.0 og nyere." #endif #ifdef __OBJC__ #import  #importere  #import "DDLog.h" #endif #ifdef DEBUG statisk const int ddLogLevel = LOG_LEVEL_VERBOSE; #else statisk const int ddLogLevel = LOG_LEVEL_ERROR; #slutt om

Som standard definerer CocoaLumberjack fire loggnivåer, (1) feil, (2) advarsel, (3) info, og (4) ordrik. Definere loggnivåer er svært vanlig i loggingsbiblioteker (for eksempel log4j og log4php). Ved å tildele et loggnivå til en loggoppstilling, kan den kategoriseres, noe som er veldig nyttig som du vil se på et øyeblikk. I den forkompilerte headerfilen erklærer vi ddLogLevel og tilordne en verdi til den. Verdien av ddLogLevel bestemmer hvilke loggerklæringer som utføres og som ignoreres. Med andre ord, hvis byggekonfigurasjonen er lik Debug (les: hvis preprosessoren makro DEBUG er definert), da ddLogLevel er lik LOG_LEVEL_VERBOSE, det høyeste loggnivået. Dette betyr at hver logg setning vil bli utført. Men hvis byggekonfigurasjonen ikke er lik Debug, bare logg ut setninger med et loggnivå på feil utføres. Det er viktig å vite at lognivåene er bestilt som du kan se i DDLog.h hvor de er definert.

Hvorfor er dette nyttig? Dette gir en veldig enkel mekanisme for å kontrollere hva som blir logget basert på byggekonfigurasjonen. Du kan prøve dette ut ved å endre den nåværende aktive ordningen i Xcode. Stopp applikasjonen og klikk på den aktive ordningen som heter logging til høyre for stoppknappen (figur 3). Å velge Rediger skjema ... fra menyen og klikk Kjør logging til venstre (figur 4). Under info kategorien, sett inn Bygg konfigurasjon til Utgivelse (figur 4). Med dette alternativet velger du byggekonfigurasjonen som Xcode skal bruke når programmet kjører i iOS-simulatoren.

Hvis du nå bygger og kjører prosjektet i iOS Simulator, bør du bare se loggoppføringer med et loggnivå på feil skrevet til Xcode's Console. Alle logginnstillingene med et loggnivå høyere enn feil ignoreres. Husk at DEBUG preprosessor makro er oppkalt CONFIGURATION_DEBUG i Xcode 3. Du kan lese mer om dette på CocoaLumberjacks Wiki.


Trinn 3: Logg på en fil

Logg på en fil er et stykke kake med CocoaLumberjack. Ikke bare er det enkelt å sette opp, CocoaLumberjack kommer med en rekke nyttige alternativer, for eksempel å begrense filstørrelsen på loggfiler og angi en rullende frekvens. Du kan til og med fortelle CocoaLumberjack å fjerne gamle loggfiler ettersom nye loggfiler er opprettet. La meg vise deg hvordan dette fungerer.

Gjenta søknadsdelegatets applikasjons: didFinishLaunchingWithOptions: metode og oppdater implementeringen som vist nedenfor. Etter initialisering av en forekomst av DDFileLogger, vi konfigurerer den ved å (1) angi den maksimale filstørrelsen til hver loggfil (i byte), (2) sette rullefrekvensen til 24 timer, og (3) sette maksimum antall loggfiler som skal holdes til syv. Ikke glem å legge til filloggeren som vi gjorde tidligere.

 - (BOOL) søknad: (UIApplication *) søknad didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Konfigurer CocoaLumberjack [DDLog addLogger: [DDASLLogger sharedInstance]]; [DDLog addLogger: [DDTTYLogger sharedInstance]]; // Initialiser fillogger DDFileLogger * fileLogger = [[DDFileLogger alloc] init]; // Konfigurer fillogger [fileLogger setMaximumFileSize: (1024 * 1024)]; [fileLogger setRollingFrequency: (3600.0 * 24.0)]; [[fileLogger logFileManager] setMaximumNumberOfLogFiles: 7]; [DDLog addLogger: fileLogger]; // Initialiser View Controller self.viewController = [[MTViewController alloker] initWithNibName: @ "MTViewController" bundle: null]; // Initialiser Window self.window = [[UIWindow alloc] initWithFrame: grenser for [[UIScreen mainScreen]]; // Konfigurer Window [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; returnere JA; 

Før du bygger og kjører prosjektet, åpner du Finder og blar til følgende sted, ~ / Bibliotek / Application Support / iPhone Simulator //Applikasjoner// Bibliotek / Caches /. Som du kan se, kan banen være litt forskjellig avhengig av hvilken versjon av iOS-simulatoren du bruker. Kjør programmet i iOS-simulatoren og kontroller innholdet i Caches katalogen. Det skal nå ha en mappe som heter logger inneholder en tekstfil med navnet log-XXXXXX.txt. De siste seks tegnene i filnavnet er unike for å hindre at loggfiler blir overskrevet. Det er mulig å spesifisere plasseringen der loggfilene er lagret. Husk at han Caches katalog kan tømmes av operativsystemet når som helst. Hvis du vil lagre programmets loggfiler på et sikrere sted, foreslår jeg at du lagrer dem i programmets dokumenter katalog.


Bonus: Farger

Selv om farger virker som ingenting annet enn øyeffis, vet alle utviklere hvor viktig fargene er når de jobber i en kodeditor. Med CocoaLumberjack kan du legge til farge til Xcode's Console. Robbie Hanson, skaperen av CocoaLumberjack, bidro også til en Xcode plugin kalt Xcode Colors. CocoaLumberjack fungerer veldig bra med Xcode Colors. Last ned den nyeste versjonen av Xcode-farger, hent ut arkivet, og sett innholdet i Xcodes plugin-mappe (plassert på ~ / Bibliotek / Programstøtte / Utvikler / Delt / Xcode / Plug-ins /), og start Xcode igjen. Vær oppmerksom på at det kan være nødvendig å manuelt opprette plugin-mappen hvis den ikke er til stede.

For å aktivere farger i Xcodes Console, gå tilbake til applikasjons: didFinishLaunchingWithOptions: metode og fortelle den delte forekomsten av TTYLogger klasse for å aktivere farger (se nedenfor). CocoaLumberjack bruker standardfarger hvis du ikke angir en farge for et bestemt loggnivå. Å override standard fargeinnstillinger er enkelt som vist nedenfor. Kjør programmet i iOS-simulatoren og kontroller Xcodes Console-vindu for å se resultatet (figur 5).

 - (BOOL) søknad: (UIApplication *) søknad didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Konfigurer CocoaLumberjack [DDLog addLogger: [DDASLLogger sharedInstance]]; [DDLog addLogger: [DDTTYLogger sharedInstance]]; // Aktiver farger [[DDTTYLogger sharedInstance] setColorsEnabled: YES]; [[DDTTYLogger sharedInstance] setForegroundColor: [UIColor greenColor] backgroundColor: null forFlag: LOG_FLAG_INFO]; // Initialiser fillogger DDFileLogger * fileLogger = [[DDFileLogger alloc] init]; // Konfigurer fillogger [fileLogger setMaximumFileSize: (1024 * 1024)]; [fileLogger setRollingFrequency: (3600.0 * 24.0)]; [[fileLogger logFileManager] setMaximumNumberOfLogFiles: 7]; [DDLog addLogger: fileLogger]; // Initialiser View Controller self.viewController = [[MTViewController alloker] initWithNibName: @ "MTViewController" bundle: null]; // Initialiser Window self.window = [[UIWindow alloc] initWithFrame: grenser for [[UIScreen mainScreen]]; // Konfigurer Window [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; returnere JA; 

Jeg har allerede nevnt at CocoaLumberjack definerer fire loggnivåer som standard. Det er imidlertid mulig å definere tilpassede loggnivåer. Jeg vil ikke diskutere tilpassede loggnivåer i denne opplæringen, men hvis du vil vite mer om denne funksjonen, foreslår jeg at du leser artikkelen om tilpassede loggnivåer på CocoaLumberjacks Wiki.

Kombinere farger med tilpassede loggnivåer resulterer i et svært kraftig verktøy for å samle inn data og feilsøke et program. Husk at CocoaLumberjack har mye mer å tilby enn det jeg har vist i denne korte opplæringen. Med CocoaLumberjack kan du opprette egendefinerte loggere og tilpassede formater. Egendefinerte loggers er spesielt nyttige hvis du vil logge deg på en database eller sende loggfiler til en ekstern server med jevne mellomrom. CocoaLumberjack er virkelig et kraftig bibliotek som har blitt et uunnværlig verktøy i verktøykassen min.


Konklusjon

Logging applikasjonsdata og diagnostisk informasjon til konsollen eller en fil kan være svært nyttig når feilsøkingsproblemer både under utvikling og produksjon. Å ha en solid logging løsning på plass er derfor viktig. Sammen med mange andre utviklere har jeg laget skreddersydde loggingsløsninger for mange prosjekter, men CocoaLumberjack er en ideell erstatning, og den har mye mer å tilby.