2013-07-17 4 views
5
+ (NSArray *)systemLogDictionariesForAppName:(NSString *)appName { 
    aslmsg q = asl_new(ASL_TYPE_QUERY); 
    asl_set_query(q, ASL_KEY_SENDER, [appName cStringUsingEncoding:NSASCIIStringEncoding], ASL_QUERY_OP_EQUAL); 
    aslresponse r = asl_search(NULL, q); 
    aslmsg m; 
    uint32_t i; 
    const char *key, *val; 
    NSMutableArray *systemLogDictionaries = [NSMutableArray array]; 

    while (NULL != (m = aslresponse_next(r))) 
    { 
     NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; 
     for (i = 0; (NULL != (key = asl_key(m, i))); i++) 
     { 
      val = asl_get(m, key); 
      NSString *stringKey = [NSString stringWithCString:key encoding:NSUTF8StringEncoding]; 
      NSString *stringVal = [NSString stringWithCString:val encoding:NSUTF8StringEncoding]; 

      [dictionary setObject:stringVal forKey:stringKey]; 
     } 
     [systemLogDictionaries addObject:dictionary]; 
    } 
    aslresponse_free(r); 

    return systemLogDictionaries; 
} 

Der obige Code ruft das Apple Systemprotokoll ab. Problem ist, es dauert etwa 8 Sekunden, um alle Protokolle aus Apple System Log (ASL) zu ziehen. Gibt es eine Möglichkeit, asl_set_query zu optimieren, um Daten schneller oder auf andere Weise zu erhalten, die mir fehlen?Optimieren Sie die Systemprotokolle des Applets

Hinweis: Können wir eine ASL-Abfrage erstellen, die Zeitstempel benötigt und wir weniger Datenmenge verarbeiten können. Das wird das Problem lösen, denke ich.

Antwort

4

ASL unterstützt ein paar verschiedene Protokollierungsstufen, sodass Sie eine restriktivere Ebene angeben können.

Zum Beispiel können Sie eine weitere Abfrage (nach der Manpage sie über die logische AND verbunden sind) hinzufügen:

// ... 
    asl_set_query(q, ASL_KEY_SENDER, [appName cStringUsingEncoding:NSASCIIStringEncoding], ASL_QUERY_OP_EQUAL); 
    // 3 is error messages 
    asl_set_query(q, ASL_KEY_LEVEL, "3", ASL_QUERY_OP_LESS_EQUAL | ASL_QUERY_OP_NUMERIC); 

    //-- Check for time --// 

    /* A dumped entry with your code looks like: 

     ASLMessageID = 1825403; 
     "CFLog Local Time" = "2013-07-20 08:33:12.943"; 
     "CFLog Thread" = 951f; 
     Facility = "com.apple.Safari"; 
     GID = 20; 
     Host = "XXX.local"; 
     Level = 4; 
     Message = "CFPropertyListCreateFromXMLData(): Old-style plist parser: missing semicolon in dictionary on line 3. Parsing will be abandoned. Break on _CFPropertyListMissingSemicolon to debug."; 
     PID = 183; 
     ReadUID = 501; 
     Sender = Safari; 
     Time = 1374305592; 
     TimeNanoSec = 943173000; 
     UID = 501; 

    Time is a Unix timestamp, so you can use it in your query with ASL_KEY_TIME and one of these operators: ASL_QUERY_OP_EQUAL, ASL_QUERY_OP_GREATER, ASL_QUERY_OP_GREATER_EQUAL, ASL_QUERY_OP_LESS, ASL_QUERY_OP_LESS_EQUAL, ASL_QUERY_OP_NOT_EQUAL 

    The code below, generates a unix timestamp for yesterday and dumps all messages that occurred yesterday or later. 
    (Nevermind the dirty/hacky way I generate the timestamp, that was just for testing purposes) 
*/ 
    NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow: -(60.0f*60.0f*24.0f)]; 
    NSString *theDate = [NSString stringWithFormat:@"%d", (int)[yesterday timeIntervalSince1970]]; 

    asl_set_query(q, ASL_KEY_TIME, [theDate cStringUsingEncoding:NSASCIIStringEncoding], ASL_QUERY_OP_GREATER_EQUAL | ASL_QUERY_OP_NUMERIC); 
    aslresponse r = asl_search(NULL, q); 
    //... 

Für einige mehr Informationen über die verschiedenen Fehlerebenen überprüfen: http://www.cocoanetics.com/2011/03/accessing-the-ios-system-log/

Hinweis Je nachdem, welche Stufe Sie eingestellt haben und wie hoch Ihre Protokollmeldungen sind, kann eine weitere Filterung keine Auswirkungen haben (dh wenn alle Nachrichten, die tatsächlich für Ihre App protokolliert werden, die gleiche Stufe haben)

Im Gegensatz zur Debug-Level-Abfrage habe ich die Timestamp-Abfrage noch nicht in einem produktiven Code verwendet, aber in einem Test scheint es vollkommen in Ordnung zu sein und tut, was es tun soll.

+0

Ich habe diesen Beitrag bereits gesehen und versucht, aber half nicht viel in meinem Fall. Aber danke für deine Antwort. – AAV

+0

Bitte überprüfen Sie meine Notiz – AAV

+0

@AmitVyawahare Ich habe Zeitstempel Abfrage der Antwort hinzugefügt, lassen Sie mich wissen, ob es für Sie funktioniert. – tttthomasssss