iOS-Logging mit Lumberjack

2
CocoaBits cocoabits.de /ios/ios-logging-mit-lumberjack/ Dirk Koller Objective-C bzw. das Foundation-Framework bringt mit der Klasse NSLog einen eingebauten Log- Mechanismus mit. Die Klasse bzw. ein Makro schreibt eine Logmeldung ins Konsolenfenster. Wer etwa aus der Java-Welt zur Cocoa-Programmierung wechselt, ist allerdings leistungsfähigere Frameworks wie das beliebte Log4J, gewohnt. Zu den Features gehören beispielsweise verschiedene Log-Level und rollierende Log-Dateien. Glücklicherweise muss man sich auch in der Cocoa-Welt nicht mit dem enthaltenen Standard begnügen. Eines der beliebtesten Frameworks zum Thema iOS-Logging ist Lumberjack. Die Software ist auf GitHub unter https://github.com/robbiehanson/CocoaLumberjack erhältlich. Im Download findet sich neben Demo-Projekten und einigen anderen Dateien der Ordner Lumberjack. Dieser wird ins eigene Projektverzeichnis kopiert und anschließend dem Projekt via File > Add Files to … zugefügt. Ist das geschehen, müssen die gewünschten Logger eingerichtet werden. Zur Verfügung stehen die folgenden Möglichkeiten: DDASLLogger (sendet Logmeldungen an den Apple System Logger, Console.app) DDTTYLogger (sendet Logmeldungen in die Xcode console) DDFileLogger (sendet Logmeldungen in eine Datei) Eine geeignete Stelle zur Konfiguration der benötigten Logger ist die Methode application:didFinishLaunchingWithOptions: im AppDelegate des Projekts. Selbstverständlich müssen die verwendeten Klassen vor der Verwendung importiert werden. // Configure the logging framework [DDLog addLogger:[DDASLLogger sharedInstance]]; [DDLog addLogger:[DDTTYLogger sharedInstance]]; DDFileLogger *fileLogger = [[[DDFileLogger alloc] init] autorelease]; fileLogger.rollingFrequency = 60 * 60 * 24; // 24 hour rolling fileLogger.logFileManager.maximumNumberOfLogFiles = 10; [DDLog addLogger:fileLogger]; Im Beispiel oben wird alle 24h rolliert, also in eine neue Datei geschrieben. Nach 10 Tagen wird die erste Datei wieder überschrieben. Danach kann geloggt werden. Bei einem bestehenden Projekt werden die NSLog-Meldungen durch Suchen & Ersetzen an Lumberjack angepasst. Die Log-Befehle für die verschiedenen Level heißen: DDLogError DDLogWarn DDLogInfo DDLogVerbose Eine Loganweisung sieht also zum Beispiel so aus:

Transcript of iOS-Logging mit Lumberjack

Page 1: iOS-Logging mit Lumberjack

CocoaBitscocoabits.de /ios/ios-logging-mit-lumberjack/

Dirk Koller

Objective-C bzw. das Foundation-Framework bringt mit der Klasse NSLog einen eingebauten Log-Mechanismus mit. Die Klasse bzw. ein Makro schreibt eine Logmeldung ins Konsolenfenster. Wer etwaaus der Java-Welt zur Cocoa-Programmierung wechselt, ist allerdings leistungsfähigere Frameworkswie das beliebte Log4J, gewohnt. Zu den Features gehören beispielsweise verschiedene Log-Levelund rollierende Log-Dateien. Glücklicherweise muss man sich auch in der Cocoa-Welt nicht mit dementhaltenen Standard begnügen. Eines der beliebtesten Frameworks zum Thema iOS-Logging istLumberjack. Die Software ist auf GitHub unter https://github.com/robbiehanson/CocoaLumberjackerhältlich.

Im Download findet sich neben Demo-Projekten und einigen anderen Dateien der Ordner Lumberjack.Dieser wird ins eigene Projektverzeichnis kopiert und anschließend dem Projekt via File > Add Files to… zugefügt.

Ist das geschehen, müssen die gewünschten Logger eingerichtet werden. Zur Verfügung stehen diefolgenden Möglichkeiten:

DDASLLogger (sendet Logmeldungen an den Apple System Logger, Console.app)

DDTTYLogger (sendet Logmeldungen in die Xcode console)

DDFileLogger (sendet Logmeldungen in eine Datei)

Eine geeignete Stelle zur Konfiguration der benötigten Logger ist die Methodeapplication:didFinishLaunchingWithOptions: im AppDelegate des Projekts. Selbstverständlich müssendie verwendeten Klassen vor der Verwendung importiert werden.

// Configure the logging framework[DDLog addLogger:[DDASLLogger sharedInstance]];[DDLog addLogger:[DDTTYLogger sharedInstance]];DDFileLogger *fileLogger = [[[DDFileLogger alloc] init] autorelease];fileLogger.rollingFrequency = 60 * 60 * 24; // 24 hour rollingfileLogger.logFileManager.maximumNumberOfLogFiles = 10;[DDLog addLogger:fileLogger];

Im Beispiel oben wird alle 24h rolliert, also in eine neue Datei geschrieben. Nach 10 Tagen wird dieerste Datei wieder überschrieben.

Danach kann geloggt werden. Bei einem bestehenden Projekt werden die NSLog-Meldungen durchSuchen & Ersetzen an Lumberjack angepasst. Die Log-Befehle für die verschiedenen Level heißen:

DDLogError

DDLogWarn

DDLogInfo

DDLogVerbose

Eine Loganweisung sieht also zum Beispiel so aus:

Page 2: iOS-Logging mit Lumberjack

DDLogInfo(@"Application is starting ...");

Zum Schluss gilt es noch, den Log-Level zu definieren. Hier bietet Lumberjack umfangreicheMöglichkeiten. Ein gängiger Ansatz ist, den Loglevel beim Debuggen relativ gesprächig einzustellen,und im Release den Level hoch zusetzen. Unnötige Ausgaben kosten Performance und es gibt auchimmer mal wieder Gerüchte, dass zu viele Log-Meldungen zur Ablehnung der App im Review-Prozessführen können. Das oben beschriebene Verhalten kann realisiert werden, indem in der DateiProjektname_Prefix.pch folgende Direktive aufgenommen wird.

#ifdef DEBUGstatic const int ddLogLevel = LOG_LEVEL_VERBOSE;#elsestatic const int ddLogLevel = LOG_LEVEL_WARN;#endif

Das Flag DEBUG wird in neueren Xcode-Projekten in der Debug-Konfiuration automatisch gesetzt.

Wer in eine Datei schreibt, möchte vermutlich den Inhalt der Datei auch irgendwann einsehen.Lumberjack gewährt mit Hilfe von DDLogFileManagerDefault Zugriff auf die Log-Files. In der Klassefinden sich Methoden wie logsDirectory oder sortedLogFileNames, mit deren Hilfe sich die DateienLokalisieren, Auslesen oder auch Versenden lassen.

Der Beitrag beschreibt nur einen kleinen Teil des mächtigen Frameworks, im GitHub-Wiki des Projektsfinden sich weitere Informationen.