使用Objective C读取发布到设备控制台的日志消息

问题描述:

我的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

在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

从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

这里是一个迅速执行,如果有人要寻找一个:

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

年长人民路建议的工作,直到完美的iOS 9,但不会与iOS 10/XCode8工作。

在iOS10/XCode8,Unified Logging和Activity Tracing中引入了一种新的日志记录方法。

https://developer.apple.com/reference/os/1891852-logging#1682426 https://developer.apple.com/videos/play/wwdc2016/721/

用户此日志记录:

https://github.com/SRGSSR/srglogger-ios