Home Tutorials Fortgeschritten Datei-Logging mit NSLog

iPhone Gewinnspiel

Datei-Logging mit NSLog PDF Drucken E-Mail
Share
Geschrieben von: Philipp   
THURSDAY, 13 MARCH 2008 00:55
Beitragsindex
Datei-Logging mit NSLog
1. NSLog() kurz erklärt
2. Datei-Logging-Funktion erstellen
3. NSLog() überschreiben
Alle Seiten
Sicherlich habt Ihr schon von der Möglichkeit gehört, mit der Funktion NSLog() selbst definierte Meldungen auf der Konsole oder in der Datei "system.log" (wenn aktiviert) auszugeben.

Auch ich habe zu Zeiten vom inoffiziellen Toolchain diese Variante benutzt, um den aktuellen Status der Applikation oder den Inhalt einer Variable zur Laufzeit zu überprüfen.
Ziemlich schnell merkte ich jedoch, das ein Datei-Logging-System benötigt wird - gerade dann, wenn man selber nicht zur Laufzeit des Programms ständig vor der Konsole sitzen kann, um zu überprüfen was gerade passiert.

Nun war ich jedoch nicht gewollt, alle meine bereits gut und detailierten NSLog() Anweisungen durch irgend welche neuen "LogToFile()" Anweisungen zu ersetzen. So habe ich den Weg gewählt die vorhandenen NSLog() Anweisungen mit einer Funktion zu überschreiben, welche sowohl auf die Konsole logt, als auch in eine von mir gewählte Datei auf dem Dateisystem des iPhones.





1. NSLog() kurz erklärt

Aber ersteinmal die Funktionsweise von NSLog kurz erklärt:
NSLog(@"ich bin ein Text");  // gibt "ich bin ein Text" auf der Konsole aus

int zahl = 2;
NSLog(@"ich bin ein %i ter Text", zahl); // gibt "ich bin eine 2 ter Text" auf der Konsole aus
NSLog(@"ich bin ein %@ Text", @"dritter") // gibt "ich bin ein dritter Text" auf der Konsole aus

NSNumber* number = [NSNumber numberWithInt:5];
NSString * text = @"ein Text";
NSArray* array = [NSArray arrayWithObjects:number,text];
NSLog(@"Inhalt des array's: %@", array); // gibt den Text "Inhalt des array's:" und zusätzlich den Inhalt des Array aus




2. Datei-Logging-Funktion erstellen

Ok, kommen wir zum eigentlichen Thema.
Um in eine Datei zu loggen, sollten wir ersteinmal festlegen wo die Datei liegt und wie diese heißen soll:
#define KLOGGING_PATH @"/private/var/mobile/Library/ApplicationName"
#define KLOGGING_FILE @"debug.log"

Nun eine Funktion, welche die gleichen Parameter hat wie NSLog()und dann selber diese in usere Logging Datei schreibt und zusätzlich nocheinmal NSLog() aufruft.
void FileLog(NSString *format, ...)
{
      va_list ap;
      NSString *print;
      va_start(ap,format);
      print=[[NSString alloc] initWithFormat:format arguments:ap];
      va_end(ap);
       
      // create directory   
      [[NSFileManager defaultManager] createDirectoryAtPath:KLOGGING_PATH attributes:nil];
 
      // open file and create if not exist
      FILE *f = fopen([NSString stringWithFormat:@"%@/%@", KLOGGING_PATH, KLOGGING_FILE], "a");

      // write to file
      fprintf(f, "%s: %s\r\n", [[[NSDate date] description] UTF8String], [print UTF8String]);
      fclose(f);
   
      // write to console
      NSLog(print);

      [print release];
}
Innerhalb der Funktion machen wir also nichts anderes, als erst alle Parameter zu lesen, dann das Logging-Verzeichnis zu erstellen (falls es noch nicht existiert), die Logging-Datei in dem Logging-Verzeichnis zu erstellen , aber auch nur falls sie noch nicht existiert und zu guter letzt die tatsächliche Meldung mit dem aktuellen Datum in die Datei schreiben.
Achso, das Loggen auf Konsole erledigen wir dann natürlich auch noch.




3. NSLog() überschreiben

Also packt diese Funktion in eine Datei, meinet wegen "utilities.c" - und implementiert eine Deklaration der Funktion in einer zugehörigen Header-Datei, z.B.:
// utilities.h

void FileLog(NSString *format, ...);

Nun ist es an der Zeit, diese breits voll einsatzfähige Funktion so zu implementieren, das eure NSLog() Anweisungen in eurem Programm durch diese neue Funktion überschrieben werden. Angenommen Ihr habt follgende Begebenheit:
#import "HelloWorldApp.h"

@implementation HelloWorldApp

- (void)applicationDidFinishLaunching:(GSEventRef)event;
{
    NSLog(@"Application START");

    .... // some stuff of your application
}

@end
 

Ihr habt nun nichts Weiteres zu tun, als eure Datei, in der die Logging-Funktion deklariert ist, zu importieren und das NSLog() wie folgt zu überschreiben:
#import "utilities.h"
#define NSLog FileLog


#import "HelloWorldApp.h"

@implementation HelloWorldApp

- (void)applicationDidFinishLaunching:(GSEventRef)event;
{
    NSLog(@"Application START");

    .... // some stuff of your application
}

@end
Alle NSLog werden jetzt durch FileLog überschieben und dadurch eben geanu diese Funktion beim Programmablauf aufgerufen.

Fertig :-)

Kommentare (1)
Erweitertes NSLog(...)
1 WEDNESDAY, 16 APRIL 2008 05:37
???
Sehr praktisch,

werde ich mal bei mir einbauen.

mfg hpm

Ihren Kommentar hinzufügen

Ihr Name:
Ihre Webseite:
Betreff:
Kommentar:
  Bild, welches den Sicherheitscode enthält
Sicherheitscode:
LAST_UPDATED2