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

Sopra il codice verrà visualizzato il registro del sistema Apple. Il problema è che ci vogliono circa 8 secondi per prelevare tutti i log da Apple System Log (ASL). C'è un modo per ottimizzare asl_set_query per ottenere i dati più velocemente o in qualsiasi altro modo che mi manca.Ottimizza i registri del sistema Apple

Nota: è possibile creare una query ASL che richiederà un timestamp e sarà possibile ottenere un numero inferiore di dati da elaborare. Questo risolverà il problema che penso.

risposta

4

ASL supporta alcuni livelli di registrazione diversi, quindi è possibile specificare un livello più restrittivo.

Ad esempio è possibile aggiungere un'altra query (a seconda della pagina man sono uniti attraverso la logica 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); 
    //... 

Per qualche informazione in più sui diversi livelli di errore controllare: http://www.cocoanetics.com/2011/03/accessing-the-ios-system-log/

Nota che, a seconda del livello impostato e del livello dei messaggi di registro, ulteriori filtraggi potrebbero non avere alcun effetto (ad esempio se tutti i messaggi effettivamente registrati per la tua app sono dello stesso livello)

Inoltre, diversamente dall'interrogazione del livello di debug, non ho ancora utilizzato l'interrogazione data/ora in alcun codice produttivo, ma in un test sembra funzionare perfettamente e sta facendo quello che dovrebbe fare.

+0

Ho già visto questo post e ho provato ma non è stato di grande aiuto nel mio caso. Ma grazie per la tua risposta. – AAV

+0

Si prega di controllare la mia nota – AAV

+0

@AmitVyawahare Ho aggiunto la data/ora di interrogazione alla risposta, fammi sapere se funziona per voi. – tttthomasssss

Problemi correlati