2013-07-17 9 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; 
} 

Powyższy kod otrzyma log systemu Apple. Problem polega na tym, że pobranie wszystkich dzienników z systemu Apple System Log (ASL) zajmuje około 8 sekund. Czy istnieje sposób optymalizacji asl_set_query, aby uzyskać dane szybciej lub w inny sposób, którego mi brakuje.Optymalizacja logów systemu jabłek

Uwaga: Czy możemy utworzyć zapytanie ASL, które będzie wymagało znacznika czasu, a my uzyskamy mniej danych do przetworzenia. To rozwiąże problem, który myślę.

Odpowiedz

4

ASL obsługuje kilka różnych poziomów rejestrowania, dzięki czemu można określić bardziej restrykcyjny poziom.

Na przykład można dodać kolejne zapytanie (według strony człowieka są połączone za pośrednictwem logicznego AND):

// ... 
    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); 
    //... 

na trochę więcej informacji na temat różnych poziomów błędów sprawdzić: http://www.cocoanetics.com/2011/03/accessing-the-ios-system-log/

Note że w zależności od ustawionego poziomu i poziomu komunikatów w dzienniku dalsze filtrowanie może nie przynieść żadnego efektu (np. jeśli wszystkie wiadomości rzeczywiście zarejestrowane dla Twojej aplikacji mają ten sam poziom)

Dalej, w przeciwieństwie do kwerend na poziomie debugowania, nie używałem jeszcze kwerend znacznika czasu w każdym kodzie produktywnym, ale w teście wydaje się on działać doskonale i robi to, co powinien.

+0

Widziałem już ten post i próbowałem, ale nie pomogłem w moim przypadku. Ale dziękuję ci za odpowiedź. – AAV

+0

Proszę sprawdzić moją notatkę – AAV

+0

@AmitVyawahare Dodałem sygnaturę czasową do odpowiedzi, daj mi znać, czy to działa dla Ciebie. – tttthomasssss