2

我正在使用带有 DDASLLogger 的 CocoaLumberjack 来获取 ASL 的日志条目,并且我想要一个日志,其中包含来自 3:rd 方的 misc NSLog:ed 输出和我自己的日志以及同一日志中的日志。

为了获得更好的画面,我提取了对 ASL 的调用并做了一个例子。我遇到的问题是,这种 ASL 提取方法只能找到使用 NSLog 编写的条目,而不是使用asl_log编写的条目。

以下是管理器控制台中的示例:

Apr 17 20:34:48 Claes-Ls-iPhone-4s ASLLogTest[7253] <Warning>: NSLog 7
Apr 17 20:34:51 Claes-Ls-iPhone-4s ASLLogTest[7253] <Critical>: ASLLog 7

提取这个时,我只得到 NSLog 行。

这是使用的代码:

写给 ASL:

NSDictionary *infoDictionary = [NSBundle mainBundle].infoDictionary;
NSString *productName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
_client = asl_open(productName.UTF8String, "com.apple.console", 0);
int status = asl_log(_client, NULL, ASL_LEVEL_CRIT, "%s", string.UTF8String);

从 ASL 读取(不提供完整的 iterate-through-asl,但它有效):

// Using ASL_QUERY_OP_TRUE to be dead-sure.
q = asl_new(ASL_TYPE_QUERY);
asl_set_query(q, ASL_KEY_SENDER, productName.UTF8String, ASL_QUERY_OP_TRUE);
aslresponse r = asl_search(NULL, q);

我错过了什么,是否无法写入 ASL 然后以这种方式阅读?

谢谢, 克拉斯

4

1 回答 1

0

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

查询给定的日志.Sender(假设productName是 aStringNSString):

let client = ASLClient()
let query = ASLQueryObject()
query.setQueryKey(.Sender, value: productName, operation: .EqualTo, modifiers: .None)

client.search(query) { record in
    if let record = record {
        // we've gotten a log entry for the search.
        // 'record' is of type ASLQueryObject.ResultRecord
    }
    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
}

注意:在 iOS 设备上,ASL只会返回您的进程创建的日志条目。此外,日志会被相当积极地修剪,并且可能只包含当前运行应用程序的条目。此处解释了 Mac/iOS 模拟器和 iOS 设备上的 ASL 行为之间的进一步差异。

于 2015-05-12T18:17:36.670 回答