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

我的iOS应用程序如何从设备控制台日志中读取消息。 我想以编程方式阅读这些日志条目(如阅读文件?),select一些,并通过电子邮件发送给支持。

我知道一个iPhone应用程序可以让你查看日志。 它的名字是Console。 但是,我不知道他使用了什么类或API。 有人build议使用ASL函数来完成,但是我不知道它们是什么或者它们在哪里被logging。

我也知道使用NSLog的一些select,如NSLogger和CocoaLumberJack,但是我们还没有准备好在这个时候实现这些。

非常感谢您的帮助!

Cocoanetics博客中的这个条目有示例代码,用于使用ASL(Apple System Logger)API( 手册页 )访问iOS上的系统日志:

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包装器。

从IOS 7开始,这种方法将不再起作用。 由于安全原因,Apple取消了对ASL的访问。

这是一个Swift实现,如果有人在寻找一个:

 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 } 

旧的方式人们build议完美的工作,直到iOS 9,但不会与iOS 10 / XCode8的工作。

在iOS10 / XCode8,统一日志logging和活动跟踪中引入了一种新的日志logging方法。

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

用户这为logging:

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