使用ASL API获取存储在ASL日志文件中的日志时间 - 目标C.

时间:2012-11-29 08:08:28

标签: objective-c asl

众所周知,我们可以在目标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;

}

2 个答案:

答案 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项目页面上设备和模拟器之间的差异部分进一步解释。