我正在将CocoaLumberjack与DDASLLogger一起使用,以获取ASL的日志条目,并且
我想有一个日志,同时包含来自3:rd party的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读取(不提供完整的aslate-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然后以这种方式阅读它是不可能的吗?

谢谢,
克莱斯

最佳答案

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

在日志中查询给定的.Sender(假设productNameStringNSString):

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 Simulator和iOS设备上ASL行为之间的进一步区别是explained here

关于ios - 提取由ask_log编写的ASL日志条目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16068095/

10-13 07:37