众所周知,我们可以在目标C中使用ASL(Apple System Logger)API来读取日志,并且使用asl_search可以检索特定的应用程序日志。 但问题是asl的输出不包括创建日志的时间。 例如,当您使用Apple System Logger在目录/ var / log中打开system.log时,您会看到如下日志:
11月28日09:19:37 localhost bootlog [0]:BOOT_TIME 1354123177 0
但是当用目标C查询asl时,它报告日志的每个属性,除了创建日志的时间,这意味着在上面提到的例子中,asl_search没有报告11月28日09:19:37
反正是否包含在目标C中使用quering asl创建日志的时间?
如果这不可能,那么检索日志时间的另一种方法是什么?
这是我的代码,请注意我们在/ var / log中的system.log文件中可以看到的日志时间不会出现在我的代码的输出中。
int main(int argc,const char * argv []) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
aslmsg q, m;
int i;
const char *key, *val;
q = asl_new(ASL_TYPE_QUERY);
asl_set_query(q, ASL_KEY_SENDER, "bootlog", ASL_QUERY_OP_EQUAL);
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);
[pool drain];
return 0;
}
答案 0 :(得分:3)
日志消息的时间戳是消息中ASL_KEY_TIME
键的值。该值是UNIX时间(自1970年1月1日起的秒数)。
您可以使用
将日志消息的时间戳转换为NSDate
NSDate *time = [NSDate dateWithTimeIntervalSince1970:(strtod(asl_get(m, ASL_KEY_TIME), NULL))];
答案 1 :(得分:0)
如果您正在使用Swift,那么有一个名为CleanroomASL的新开源项目,它提供了一个类型安全的API,用于读取和写入Apple System Log条目。
查询日志会返回每个条目的时间戳:
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;
// you can access the timestamp as an NSDate
// using the record.timestamp property
}
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)
上面的代码将返回过去5分钟内记录的所有ASL日志条目,这些日志条目也具有.Message
属性的值。
注意:在iOS设备上,ASL将仅返回您的流程生成的日志条目。此外,日志被相当积极地修剪,并且可能仅包括当前运行的应用程序所做的条目。如果您希望将日志条目保留在此之外,您可能需要查看更强大的Swift日志记录包,例如CleanroomLogger。
Mac / iOS模拟器和iOS设备上的ASL行为之间的差异将在GitHub上CleanroomASL项目页面上设备和模拟器之间的差异部分进一步解释。