2011-05-26 49 views
28

我的iOS應用程序如何從設備控制檯日誌中讀取消息。我想以編程方式閱讀這些日誌條目(如閱讀文件?),選擇一些,並通過電子郵件發送給支持。使用Objective C讀取發佈到設備控制檯的日誌消息

我知道一個iPhone應用程序,它可以讓你查看日誌。它的名字是Console。但是,我無法弄清楚他使用了什麼類或API。有人建議使用ASL函數完成它,但我不知道它們是什麼或它們在哪裏被記錄。

我也知道使用NSLog的一些替代方法,如NSLogger和CocoaLumberJack,但我們還沒有準備好在這個時候實現這些方法。

非常感謝您的幫助!

+1

讀http://boredzo.org/blog/archives/2008-01-19/next-week-apple-system - 它會給你一個關於整個ASL的好主意。 – Jano 2011-05-26 22:15:55

+0

+1謝謝!我會詳細閱讀。 – 2011-05-27 00:55:58

回答

28

在Cocoanetics博客This entry有樣本代碼來訪問使用ASL的iOS系統日誌(蘋果系統記錄器)API(man page):

aslmsg q, m; 
int i; 
const char *key, *val; 

q = asl_new(ASL_TYPE_QUERY); 

aslresponse r = asl_search(NULL, q); 
while (NULL != (m = aslresponse_next(r))) 
{ 
    NSMutableDictionary *tmpDict = [NSMutableDictionary dictionary]; 

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

     val = asl_get(m, key); 

     NSString *string = [NSString stringWithUTF8String:val]; 
     [tmpDict setObject:string forKey:keyString]; 
    } 

    NSLog(@"%@", tmpDict); 
} 
aslresponse_free(r); 

請注意,您需要輪詢ASL閱讀最新消息。上面的代碼在iPhone模擬器上運行時也會失敗,但在實際設備上運行得很好。

如果您不想與C ASL API對抗,請查看名爲ASLogger的此Objective-C包裝。

+0

這看起來很完美。謝謝! – 2011-05-27 01:25:47

+2

其實這個代碼有問題。在iOS上寫入控制檯的大部分消息都標記爲感性。只有系統應用程序可以讀取它們。所以,你最終只能讀取你自己的日誌。 – 2012-10-16 22:55:43

7

從IOS 7起,此方法將不再起作用。由於安全原因,Apple取消了ASL的訪問權限。

+0

真的嗎?在IOS7中,我仍然可以讀取由NSLog編寫的ASL消息。但對於由DDLog記錄的消息,它不能在真實設備上工作。 – Andrew 2013-11-26 13:38:46

+12

在iOS 7中,您可以使用ASL讀取您自己的應用程序輸出的消息,包括之前運行的應用程序的同一版本,但不包括系統或任何其他應用程序輸出的消息。 – sup 2014-01-03 23:07:35

+0

謝謝sup。發現。我可以回答你的問題。 – Trung 2014-01-06 17:35:18

3

這裏是一個迅速執行,如果有人要尋找一個:

static func systemLogs() -> [[String: String]] { 
    let q = asl_new(UInt32(ASL_TYPE_QUERY)) 
    var logs = [[String: String]]() 
    let r = asl_search(nil, q) 
    var m = asl_next(r) 
    while m != nil { 
     var logDict = [String: String]() 
     var i: UInt32 = 0 
     while true { 
      if let key = String.fromCString(asl_key(m, i)) { 
       let val = String.fromCString(asl_get(m, key)) 
       logDict[key] = val 
       i++ 
      } else { 
       break 
      } 
     } 
     m = asl_next(r) 
     logs.append(logDict) 
    } 
    asl_release(r) 
    return logs 
} 
+0

謝謝,但我仍然無法捕獲由swift的「打印」發送的日誌,它只捕獲NSLog的任何想法? – Jimmar 2015-10-05 13:58:05

+1

@JiMMaR你將無法捕捉到這些。 Swift的打印完全跳過了Apple的日誌記錄工具。如果你想讓這些日誌進入Apple的日誌記錄工具,可以使用NSLog或者在兩者上創建自己的包裝。 – 2015-10-05 18:15:45

+2

這很棒,但現在只要我們有一些與iOS 10和新os_log兼容的東西。你不會碰巧有,你會嗎? – 2016-10-07 23:49:22

相關問題