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

上記のコードは、リンゴシステムログを取得します。問題は、Apple System Log(ASL)からすべてのログを取得するのに約8秒かかることです。 asl_set_queryを最適化してデータを高速に取得する方法や、欠落している方法がありますか?リンゴシステムログを最適化する

注:タイムスタンプを取るASLクエリを作成できますか?処理するデータの数を減らすことができます。これは私が思う問題を解決します。

答えて

4

ASLはいくつかの異なるロギングレベルをサポートしているため、より限定的なレベルを指定できます。あなたが(彼らは論理的ANDを介して接合されているmanページによると)別のクエリを追加することができる。例えば

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

異なるエラーレベルにいくつかの詳細については、チェック:http://www.cocoanetics.com/2011/03/accessing-the-ios-system-log/

注意を設定したレベルとログメッセージのレベルに応じて、フィルタリングは効果がありません(つまり、実際にあなたのアプリに記録されているすべてのメッセージが同じレベルの場合)

さらに、デバッグレベルのクエリとは異なり、私はまだ生産的なコードでクエリのタイムスタンプを使用していませんが、テストでは完全に正常に動作していると思われる処理を行っています。

+0

私はすでにこの投稿を見て、試してみましたが、私の場合は助けになりませんでした。しかし、あなたの答えに感謝します。 – AAV

+0

私のメモを確認してください – AAV

+0

@AmitVyawahare私はタイムスタンプを回答に追加しました。 – tttthomasssss