我的iOS应用程序如何从设备控制台日志中读取消息。我想以编程方式读取这些日志条目(如读取文件?),选择一些,然后通过电子邮件发送给支持。
我知道有一个iPhone应用程序可以让你查看日志。它的名字是Console。但是,我无法弄清楚他使用了哪些类或API。有人建议使用ASL函数完成,但我不知道它们是什么或它们被记录在哪里。
我也知道使用NSLog的几种替代方法,例如NSLogger和CocoaLumberJack,但我们目前还没准备好实现这些。
非常感谢您的帮助!
答案 0 :(得分:28)
This entry提供了使用ASL(Apple System Logger)API(man page)访问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包装器。
答案 1 :(得分:7)
从IOS 7开始,此方法将不再起作用。由于安全原因,Apple取消了对ASL的访问权限。
答案 2 :(得分:3)
如果有人正在寻找一个,那么这是一个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
}
答案 3 :(得分:0)
人们建议在iOS 9之前完成工作的旧方式,但这不适用于iOS 10 / XCode8。
在iOS10 / XCode8,统一记录和活动追踪中引入了一种新的记录方式。
https://developer.apple.com/reference/os/1891852-logging#1682426 https://developer.apple.com/videos/play/wwdc2016/721/
将此用于记录: