2014-03-03 146 views
1

我想使用ASL獲取控制檯日誌。我已經編寫了下面的代碼,並且我在iPhone模擬器中獲得了所有控制檯日誌,但是當我使用iPhone 4.1和iPad時,我從控制檯開始就沒有充分的手段。我嘗試了很多。如何在ios中使用ASL獲取控制檯日誌?

- (NSMutableArray *)getAppLogByApp:(NSString *)appName 
{ 
    NSMutableArray  *lObjAppLogsPtr = (NSMutableArray *)nil; 
    LogInfo   *lObjLogInfoPtr = (LogInfo *)nil; 

    aslmsg q, m; 
    int i; 
    const char *key, *val, *lAppName; 
    NSDateFormatter *lObjDateFormatter = [[NSDateFormatter alloc] init]; 
    [lObjDateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 


    q = asl_new(ASL_TYPE_QUERY); 

    //also set the log level to fetch if is set to the global variable m_cObjLogMessageLevel 
    const char* lObjASLLogLevel = [[NSString stringWithFormat:@"%d", m_cLogMessageLevel] UTF8String]; 
    asl_set_query(q, ASL_KEY_LEVEL, lObjASLLogLevel, ASL_QUERY_OP_LESS_EQUAL | ASL_QUERY_OP_NUMERIC); 
    //asl_set_query(q, ASL_KEY_LEVEL, lObjASLLogLevel, ASL_QUERY_OP_EQUAL | ASL_QUERY_OP_NUMERIC); 
    //if appName passed to it then fetch the logs for this application only 
    if ((NSString *)nil != appName && 0 < appName.length) 
    { 
     lAppName = [appName UTF8String]; 
     asl_set_query(q, ASL_KEY_SENDER, lAppName, ASL_QUERY_OP_EQUAL); 
    } 

    aslresponse r = asl_search(NULL, q); 

    while (NULL != (m = aslresponse_next(r))) 
    { 
     if ((NSMutableArray *)nil == lObjAppLogsPtr) 
     { 
      lObjAppLogsPtr = [[NSMutableArray alloc] init]; 
     } 

     for (i = 0; (NULL != (key = asl_key(m, i))); i++) 
     { 
      NSString *keyString = [NSString stringWithUTF8String:(char *)key]; 

      val = asl_get(m, key); 

      NSString *lObjValString = nil; 
      if (nil != val) 
      { 
       lObjValString = [NSString stringWithUTF8String:val]; 
      } 
      else 
      { 
       //NSLog(@"Val in nil"); 
       lObjValString = @""; 
      } 

      if ((LogInfo *)nil == lObjLogInfoPtr) 
      { 
       lObjLogInfoPtr = [[LogInfo alloc] init]; 
      } 


      if(YES == [keyString isEqualToString:@"Level"]) 
      { 
       lObjLogInfoPtr.m_cObjLevel = lObjValString; 
      } 
      else if(YES == [keyString isEqualToString:@"Time"]) 
      { 
       //convert the time to YYYY-MM-DD HH:MM:SS format 
       time_t time = strtol(val, NULL, 0); 

       NSDate *lObjDatePtr = [[NSDate dateWithTimeIntervalSince1970:time] copy]; 
       NSString *lObjDateStringPtr = [lObjDateFormatter stringFromDate:lObjDatePtr]; 
       lObjLogInfoPtr.m_cObjTime = lObjDateStringPtr; 
      } 
      else if(YES == [keyString isEqualToString:@"Sender"]) 
      { 
       lObjLogInfoPtr.m_cObjSender = lObjValString; 
      } 
      else if(YES == [keyString isEqualToString:@"Message"]) 
      { 
       lObjLogInfoPtr.m_cObjMessage = lObjValString; 
      } 
     } 

     //Add the loginfo array 
     [lObjAppLogsPtr addObject:lObjLogInfoPtr]; 
     //Release the loginfo and set it to nil for further use 
     [lObjLogInfoPtr release]; 
     lObjLogInfoPtr = (LogInfo *)nil; 
    } 

    if (NULL != r) 
    { 
     aslresponse_free(r); 
    } 

    //free the als msg object 
    asl_free(q); 
    [lObjDateFormatter release]; 


    return lObjAppLogsPtr; 
} 

這裏LogIngoNSObject一個子類。 請幫助我。自一週以來我一直在嘗試。

+0

ASL是指?它是框架嗎? – Gaurav

+0

@guarav:ASL是指提供所有控制檯日誌(如錯誤,warnigs等)的蘋果系統日誌。有關更多詳細信息,請參閱asl.h文件。 –

回答

4

在Mac上(因此在iOS模擬器中)的行爲是不同的;在Mac上,默認情況下,進程可以讀取其他進程創建的日誌條目。在iOS設備上,ASL將只有返回由進程生成的日誌條目,並且僅當您明確將ASL_KEY_READ_UID設置爲「-1」時。

另外,日誌在設備上被修剪得相當積極,並且可能只包含應用程序當前運行所做的條目。 (如果您想保留日誌條目並且使用Swift,則可能需要查看更強大的日誌記錄程序包,例如CleanroomLogger。)

如果您使用的是Swift,源項目名爲CleanroomASL,它提供了用於讀寫Apple系統日誌條目的類型安全API。使用CleanroomASL,搜索翔升日誌條目看起來像:

let client = ASLClient() 
let query = ASLQueryObject() 

client.search(query) { record in 
    if let record = record { 
     // we've gotten a log entry for the search. 
     // 'record' is of type ASLQueryObject.ResultRecord 
    } 
    else { 
     // there are no more log entries to process 
    } 
    // return true while we still want to get results 
    // or return false when we don't want to process more 
    return true 
} 

您可以通過設置額外的查詢鍵約束自己的搜索查詢:

query.setQueryKey(.Message, value: nil, operation: .KeyExists, modifiers: .None) 
query.setQueryKey(.Time, value: Int(NSDate().timeIntervalSince1970 - (60 * 60)), operation: .GreaterThanOrEqualTo, modifiers: .None) 

上面的代碼將返回記錄的最後都ASL日誌條目5分鐘也具有.Message屬性的值。

相關問題