CocoaLumberjack Auf Steroiden anmelden

Die Protokollierung ist eines der nützlichsten Instrumente, um iOS- und OS X-Anwendungen zu prüfen, zu verstehen und zu debuggen. Sie kennen wahrscheinlich die NSLog Funktion durch das Foundation-Framework bereitgestellt, aber haben Sie jemals das Bedürfnis nach etwas Stärkerem gefühlt? CocoaLumberjack ist eine Open-Source-Bibliothek, die von Robbie Hanson erstellt und verwaltet wird. In CocoaLumberjack wird die Protokollierung auf ein völlig neues Niveau gehoben. In diesem Tutorial werde ich Ihnen zeigen, wie Sie CocoaLumberjack in einer iOS-Anwendung einrichten und verwenden.


Protokollierung Wer muss protokollieren??

Das Protokollieren von Diagnoseinformationen auf einer Konsole, einer Datei oder einem Remote-Server wird in nahezu jeder Art von Softwareentwicklung weit verbreitet. Es ist eine der einfachsten Formen des Debugging, weshalb es wahrscheinlich so weit verbreitet ist. Es ist das erste Werkzeug, das ich verwende, wenn ich ein komplexes Stück Logik debuggen oder versuche, unabhängig von der Sprache zu verstehen. Es ist einfach, schnell und mit sehr wenig Aufwand verbunden.

Warum sollten Sie CocoaLumberjack verwenden, wenn Sie nur Daten an die Konsole oder eine Datei senden? Ein Grund ist, dass CocoaLumberjack (meistens) schneller ist als der NSLog Funktion, die uns das Foundation Framework bietet. Dank einer Reihe von praktischen Makros, die von CocoaLumberjack zur Verfügung gestellt werden, können Sie von wechseln NSLog zu CocoaLumberjack ist so einfach wie das Ersetzen NSLog mit DDLog Aussagen.

Ein weiterer Vorteil von CocoaLumberjack ist, dass eine Protokollanweisung an mehrere Logger gesendet werden kann (Konsole, Datei, entfernte Datenbank usw.). Sie können CocoaLumberjack so konfigurieren, dass es sich je nach Build-Konfiguration (Debug, Release usw.) unterschiedlich verhält. CocoaLumberjack kann noch viel mehr für Sie tun. Lassen Sie mich Ihnen zeigen, wie Sie mit dieser schicken Bibliothek beginnen.


Schritt 1: CocoaLumberjack einrichten

Erstellen Sie ein neues Projekt in Xcode, indem Sie das auswählen Einzelansicht-Anwendung Vorlage aus der Liste der verfügbaren Vorlagen (Abbildung 1). Benennen Sie Ihre Bewerbung Protokollierung, Geben Sie eine Firmenkennung ein iPhone für die Gerätefamilie und überprüfen Sie dann Verwenden Sie die automatische Referenzzählung. Die übrigen Kontrollkästchen können für dieses Projekt deaktiviert bleiben (Abbildung 2). Teilen Sie Xcode mit, wo Sie das Projekt speichern möchten, und drücken Sie die Erstellen Taste.

Das Hinzufügen der CocoaLumberjack-Bibliothek zu Ihrem Projekt ist so einfach wie das Herunterladen der neuesten Version von GitHub, das Extrahieren des Archivs und das Ziehen des Ordners mit dem Namen Holzfäller in dein Projekt. Die Kerndateien sind DDLog.h / .m, DDASLLogger.h / .m, DDTTYLogger.h / .m, und DDFileLogger.h / .m. Die anderen Dateien im Ordner sind Stubs für fortgeschrittenere Anwendungen von CocoaLumberjack, auf die ich in diesem Tutorial nicht eingehen werde. Sie können diese Dateien ignorieren oder löschen.

Wenn Sie einen Gipfel im Inneren nehmen DDLog.h und DDLog.m, Sie werden von der Anzahl der Codezeilen in diesen Dateien überrascht sein. Wie gesagt, CocoaLumberjack hat viele nützliche Funktionen. CocoaLumberjack ist mächtiger als NSLog weil Multi-Threading, Grand Central Dispatch und die Leistungsfähigkeit der Objective-C-Laufzeit genutzt werden.

Sie werden auch feststellen, dass eine überraschend große Anzahl von Makros definiert ist DDLog.h. Wir werden die Mehrheit dieser Makros nicht verwenden. Die Makros, die wir in diesem Tutorial verwenden werden, sind DDLogError, DDLogWarn, DDLogInfo, und DDLogVerbose. Sie führen alle dieselbe Aufgabe aus, aber jedem Makro ist eine Protokollebene zugeordnet. Ich werde in wenigen Augenblicken mehr über Log-Levels sprechen.

Bevor Sie mit CocoaLumberjack beginnen, sollten Sie der vorkompilierten Header-Datei des Projekts eine Importanweisung hinzufügen. Öffnen Logging-Prefix.pch und fügen Sie eine Importanweisung für hinzu DDLog.h. Damit stellen Sie sicher, dass die in DDLog.h sind im gesamten Projekt verfügbar.

 #einführen  #ifndef __IPHONE_4_0 #warning "Dieses Projekt verwendet Funktionen, die nur in iOS SDK 4.0 und höher verfügbar sind." #endif #ifdef __OBJC__ #import  #einführen  #import "DDLog.h" #endif

Schritt 2: Hinzufügen eines Loggers

Die Konfiguration von CocoaLumberjack ist einfach. Zunächst müssen wir jedoch mehrere Klassen der CocoaLumberjack-Bibliothek importieren. Oben MTAppDelegate.m, Fügen Sie eine Importanweisung für hinzu DDASLLogger.h, DDTTYLogger.h, und DDFileLogger.h (siehe unten). Die ersten beiden Klassen sind für das Senden von Protokollnachrichten an die Konsolenanwendung (Console.app) und die Xcode-Konsole zuständig. Das DDFileLogger Die Klasse sorgt dafür, dass Protokollnachrichten in eine Datei auf der Festplatte geschrieben werden.

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

In den Bewerbungsdelegierten Anwendung: didFinishLaunchingWithOptions: Methode fügen wir zwei Logger hinzu, wie unten gezeigt. Beide DDASLLogger und DDTTYLogger sind Singletons, wie Sie vielleicht bemerkt haben. Mit diesem Setup simulieren wir das Verhalten von NSLog Funktion, d. h. Protokollnachrichten werden an die Konsolenanwendung (Console.app) und die Xcode-Konsole gesendet.

 - Anwendung (BOOL): Anwendung (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Configure CocoaLumberjack [DDLog addLogger: [DDASLLogger sharedInstance]]; [DDLog addLogger: [DDTTYLogger sharedInstance]]; // Initialize View Controller self.viewController = [[MTViewController-Zuordnung] initWithNibName: @ "MTViewController" -Bündel: nil]; // Fenster initialisieren self.window = [[UIWindow-Zuordnung] initWithFrame: [[UIScreen-MainScreen] -Begrenzungen]]; // Fenster konfigurieren [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; JA zurückgeben; 

Dies ist alles, was wir tun müssen, um mit CocoaLumberjack zu beginnen. Sie können dies testen, indem Sie dem Protokoll die folgenden Protokollanweisungen hinzufügen viewDidLoad Methode der MTViewController Klasse. Erstellen und führen Sie das Projekt im iOS-Simulator aus, um zu sehen, ob alles wie erwartet funktioniert.

 - (void) viewDidLoad [super viewDidLoad]; DDLogError (@ "Dies ist ein Fehler."); DDLogWarn (@ "Dies ist eine Warnung."); DDLogInfo (@ "Dies ist nur eine Nachricht."); DDLogVerbose (@ "Dies ist eine ausführliche Nachricht."); 

Haben Sie auch einen Compiler-Fehler erhalten? Der Compiler-Fehler liest Verwendung des nicht deklarierten Bezeichners 'ddLogLevel'. Es scheint, dass wir erklären müssen ddLogLevel bevor wir CocoaLumberjack verwenden können. Dies ist eigentlich eine Funktion von CocoaLumberjack. Indem Sie einen Wert deklarieren und dynamisch zuweisen ddLogLevel Wir können CocoaLumberjack so konfigurieren, dass Protokollanweisungen basierend auf der Build-Konfiguration ausgeführt werden. Um zu verstehen, was ich meine, ändern Sie die vorkompilierte Header-Datei unseres Projekts (Logging-Prefix.pch) Wie nachfolgend dargestellt.

 #einführen  #ifndef __IPHONE_4_0 #warning "Dieses Projekt verwendet Funktionen, die nur in iOS SDK 4.0 und höher verfügbar sind." #endif #ifdef __OBJC__ #import  #einführen  #import "DDLog.h" #endif #ifdef DEBUG statisch const int ddLogLevel = LOG_LEVEL_VERBOSE; #else static const int ddLogLevel = LOG_LEVEL_ERROR; #endif

Standardmäßig definiert CocoaLumberjack vier Protokollebenen (1). Error, (2) Warnung, (3) Info, und (4) verbose. Das Definieren von Protokollierungsstufen ist in Logging-Bibliotheken (z. B. log4j und log4php) sehr üblich. Durch das Zuweisen einer Protokollebene zu einer Protokollanweisung kann sie kategorisiert werden, was, wie Sie gleich sehen werden, sehr nützlich ist. In der vorkompilierten Header-Datei wird deklariert ddLogLevel und weisen Sie ihm einen Wert zu. Der Wert von ddLogLevel legt fest, welche Protokollanweisungen ausgeführt und welche ignoriert werden. Mit anderen Worten, wenn die Build-Konfiguration gleich ist Debuggen (lesen Sie: wenn das Präprozessor-Makro DEBUGGEN definiert ist) ddLogLevel entspricht LOG_LEVEL_VERBOSE, die höchste Protokollebene. Dies bedeutet, dass jede Protokollanweisung ausgeführt wird. Wenn jedoch die Build-Konfiguration nicht gleich ist Debuggen, dann nur Protokollanweisungen mit einem Protokollierungsgrad von Error ausgeführt werden. Es ist wichtig zu wissen, dass die Protokollebenen geordnet sind, wie Sie in sehen können DDLog.h wo sie definiert sind.

Warum ist das nützlich? Dies bietet einen sehr einfachen Mechanismus, um zu steuern, was basierend auf der Build-Konfiguration protokolliert wird. Sie können dies ausprobieren, indem Sie das aktuell aktive Schema in Xcode ändern. Stoppen Sie die Anwendung und klicken Sie auf das aktive Schema Protokollierung auf der rechten Seite der Stopp-Taste (Abbildung 3). Wählen Schema bearbeiten… aus dem Menü und klicken Sie auf Führen Sie die Protokollierung aus auf der linken Seite (Abbildung 4). Unter dem Info Tab, setzen Sie die Konfiguration erstellen zu Veröffentlichung (Figur 4). Mit dieser Option wählen Sie die Build-Konfiguration aus, die Xcode verwenden soll, wenn die Anwendung im iOS-Simulator ausgeführt wird.

Wenn Sie jetzt Ihr Projekt im iOS-Simulator erstellen und ausführen, sollten Sie nur Protokollanweisungen mit einem Protokollierungsgrad von sehen Error auf die Xcode-Konsole gedruckt. Alle Protokollanweisungen mit einem höheren Protokollierungsgrad als Fehler werden ignoriert. Denken Sie daran, dass die DEBUGGEN Präprozessor-Makro wird benannt CONFIGURATION_DEBUG In Xcode 3 erfahren Sie mehr darüber im CocoaLumberjack-Wiki.


Schritt 3: Protokollierung in einer Datei

Mit CocoaLumberjack ist das Einloggen in eine Datei ein Kinderspiel. CocoaLumberjack ist nicht nur einfach einzurichten, sondern bietet auch eine Reihe nützlicher Optionen, z. B. das Beschränken der Dateigröße von Protokolldateien und das Festlegen einer Lauffrequenz. Sie können sogar CocoaLumberjack anweisen, alte Protokolldateien zu entfernen, wenn neue Protokolldateien erstellt werden. Lassen Sie mich Ihnen zeigen, wie das funktioniert.

Wiederholen Sie den Antragsdelegierten Anwendung: didFinishLaunchingWithOptions: Methode und aktualisieren Sie die Implementierung wie unten gezeigt. Nach dem Initialisieren einer Instanz von DDFileLogger, Wir konfigurieren es durch (1) Einstellen der maximalen Dateigröße jeder Protokolldatei (in Byte), (2) Einstellen der Rollfrequenz auf 24 Stunden und (3) Einstellen der maximalen Anzahl von Protokolldateien, die auf sieben gehalten werden sollen. Vergessen Sie nicht, den Datei-Logger wie zuvor hinzuzufügen.

 - Anwendung (BOOL): Anwendung (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Configure CocoaLumberjack [DDLog addLogger: [DDASLLogger sharedInstance]]; [DDLog addLogger: [DDTTYLogger sharedInstance]]; // Dateiprotokollierung initialisieren DDFileLogger * fileLogger = [[DDFileLogger-Zuordnung] init]; // Configure 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-Zuordnung] initWithNibName: @ "MTViewController" -Bündel: nil]; // Fenster initialisieren self.window = [[UIWindow-Zuordnung] initWithFrame: [[UIScreen-MainScreen] -Begrenzungen]]; // Fenster konfigurieren [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; JA zurückgeben; 

Bevor Sie das Projekt erstellen und ausführen, öffnen Sie den Finder und navigieren Sie zum folgenden Speicherort, ~ / Bibliothek / Anwendungssupport / iPhone Simulator // Anwendungen // Bibliothek / Caches /. Wie Sie sehen, kann der Pfad je nach verwendeter Version des iOS-Simulators geringfügig abweichen. Führen Sie die Anwendung im iOS-Simulator aus und überprüfen Sie den Inhalt des Caches Verzeichnis. Es sollte jetzt einen Ordner mit dem Namen haben Protokolle eine Textdatei mit dem Namen log-XXXXXX.txt. Die letzten sechs Zeichen des Dateinamens sind eindeutig, um zu verhindern, dass Protokolldateien überschrieben werden. Es ist möglich, den Ort anzugeben, an dem die Protokolldateien gespeichert werden. Denken Sie daran, dass er Caches Das Verzeichnis kann jederzeit vom Betriebssystem geleert werden. Wenn Sie die Protokolldateien Ihrer Anwendung an einem sichereren Ort speichern möchten, empfehle ich, sie in den Anwendungsdateien zu speichern Unterlagen Verzeichnis.


Bonus: Farben

Auch wenn Farben nichts anderes als eine Augenweide sind, weiß jeder Entwickler, wie wichtig Farben in einem Code-Editor sind. Mit CocoaLumberjack können Sie der Xcode-Konsole Farbe hinzufügen. Robbie Hanson, der Schöpfer von CocoaLumberjack, trug ebenfalls zu einem Xcode-Plugin mit dem Namen Xcode Colors bei. CocoaLumberjack funktioniert sehr gut mit Xcode Colors. Laden Sie die neueste Version von Xcode Colors herunter, extrahieren Sie das Archiv und legen Sie den Inhalt in den Plugin-Ordner von Xcode (unter ~ / Library / Anwendungssupport / Entwickler / Shared / Xcode / Plug-Ins /) und starten Sie Xcode neu. Beachten Sie, dass es möglicherweise erforderlich sein muss, den Plug-In-Ordner manuell zu erstellen, falls er nicht vorhanden ist.

Um Farben in der Xcode-Konsole zu aktivieren, gehen Sie zurück zur Anwendung: didFinishLaunchingWithOptions: Methode und teilen Sie der gemeinsam genutzten Instanz der TTYLogger Klasse, um Farben zu aktivieren (siehe unten). CocoaLumberjack verwendet Standardfarben, wenn Sie für eine bestimmte Protokollebene keine Farbe angeben. Das Überschreiben der Standardfarbeinstellungen ist wie unten gezeigt einfach. Führen Sie die Anwendung im iOS-Simulator aus und überprüfen Sie das Konsolenfenster von Xcode, um das Ergebnis zu sehen (Abbildung 5)..

 - Anwendung (BOOL): Anwendung (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Configure CocoaLumberjack [DDLog addLogger: [DDASLLogger sharedInstance]]; [DDLog addLogger: [DDTTYLogger sharedInstance]]; // Farben aktivieren [[DDTTYLogger sharedInstance] setColorsEnabled: YES]; [[DDTTYLogger sharedInstance] setForegroundColor: [UIColor greenColor] backgroundColor: nil forFlag: LOG_FLAG_INFO]; // Dateiprotokollierung initialisieren DDFileLogger * fileLogger = [[DDFileLogger-Zuordnung] init]; // Configure 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-Zuordnung] initWithNibName: @ "MTViewController" -Bündel: nil]; // Fenster initialisieren self.window = [[UIWindow-Zuordnung] initWithFrame: [[UIScreen-MainScreen] -Begrenzungen]]; // Fenster konfigurieren [self.window setRootViewController: self.viewController]; [self.window makeKeyAndVisible]; JA zurückgeben; 

Ich habe bereits erwähnt, dass CocoaLumberjack standardmäßig vier Protokollebenen definiert. Es ist jedoch möglich, benutzerdefinierte Protokollebenen zu definieren. In diesem Lernprogramm werde ich nicht über benutzerdefinierte Protokollierungsstufen sprechen. Wenn Sie jedoch mehr über diese Funktion erfahren möchten, sollten Sie den Artikel über benutzerdefinierte Protokollierungsstufen in CocoaLumberjack's Wiki lesen.

Die Kombination von Farben mit benutzerdefinierten Protokollebenen führt zu einem sehr leistungsfähigen Werkzeug zum Erfassen von Daten und zum Debuggen einer Anwendung. Denken Sie daran, dass CocoaLumberjack viel mehr zu bieten hat als das, was ich in diesem kurzen Tutorial gezeigt habe. Mit CocoaLumberjack können Sie sowohl benutzerdefinierte Logger als auch benutzerdefinierte Formatierer erstellen. Benutzerdefinierte Logger sind besonders nützlich, wenn Sie sich in einer Datenbank anmelden oder Protokolldateien in regelmäßigen Abständen an einen Remote-Server senden möchten. CocoaLumberjack ist wirklich eine leistungsstarke Bibliothek, die zu einem unverzichtbaren Werkzeug in meiner Toolbox geworden ist.


Fazit

Das Protokollieren von Anwendungsdaten und Diagnoseinformationen in der Konsole oder in einer Datei kann beim Debuggen von Problemen sowohl während der Entwicklung als auch in der Produktion sehr nützlich sein. Eine solide Protokollierungslösung ist daher unerlässlich. Zusammen mit vielen anderen Entwicklern habe ich für viele Projekte angepasste Protokollierungslösungen entwickelt, aber CocoaLumberjack ist ein idealer Ersatz und hat viel mehr zu bieten.