首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用API C获取存储在ASL日志文件中的日志时间

用API C获取存储在ASL日志文件中的日志时间
EN

Stack Overflow用户
提问于 2012-11-29 08:08:28
回答 2查看 1.4K关注 0票数 1

我们知道,我们可以使用目标C中的ASL () API读取日志,也可以使用asl_search检索特定的应用程序日志。但问题是asl的输出不包括日志创建的时间。例如,当您使用在/var/log目录中打开system.log时,您会看到这样的日志:

11月28日09:19:37本地主机引导日志: BOOT_TIME 1354123177 0

但是当用目标C查询asl时,它会报告日志的所有属性,除了创建日志的时间外,这意味着在上面提到的例子中,asl_search没有报告11月28日09:19:37

在目标C中是否包括使用quering asl创建日志的时间?如果这是不可能的,另一种检索日志时间的方法是什么?

这是我的代码,请注意,我们可以在/var/log中的system.log文件中看到的日志时间没有出现在我的代码的输出中。

int (int,const * argv[]) {

代码语言:javascript
复制
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;

}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-12 07:15:49

日志消息的时间戳是消息中ASL_KEY_TIME键的值。该值是UNIX时间(自1.1.1970以来的秒数)。

可以将日志消息的时间戳转换为NSDate

代码语言:javascript
复制
NSDate *time = [NSDate dateWithTimeIntervalSince1970:(strtod(asl_get(m, ASL_KEY_TIME), NULL))];
票数 3
EN

Stack Overflow用户

发布于 2015-05-12 18:11:46

如果您使用Swift,有一个名为CleanroomASL的新开源项目,它提供了一个类型安全的API,用于读取和写入Apple条目。

查询日志将返回每个条目的时间戳:

代码语言:javascript
复制
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
}

可以通过设置其他查询键限制搜索查询:

代码语言:javascript
复制
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行为之间的差异将在CleanroomASL项目页面上GitHub上的设备和模拟器之间的差异一节中进一步解释。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13621343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档