Using Objective C to read log messages posted to t

2019-01-06 09:45发布

How can my iOS application read messages from the devices console log. I want to programmatically read through these log entries (like reading a file?), select some, and email them to support.

I'm aware of one iPhone application which lets you view the log. It's name is Console. However, I can't figure out what classes or APIs he used. One person suggested it was done using ASL functions, but I don't know what these are or where they are documented.

I'm also aware of several alternatives to using NSLog such as NSLogger and CocoaLumberJack, but we aren't ready to implement these at this time.

Thanks very much for any help!

4条回答
等我变得足够好
2楼-- · 2019-01-06 10:05

Here's a Swift implementation if anyone's looking for one:

static func systemLogs() -> [[String: String]] {
    let q = asl_new(UInt32(ASL_TYPE_QUERY))
    var logs = [[String: String]]()
    let r = asl_search(nil, q)
    var m = asl_next(r)
    while m != nil {
        var logDict = [String: String]()
        var i: UInt32 = 0
        while true {
            if let key = String.fromCString(asl_key(m, i)) {
                let val = String.fromCString(asl_get(m, key))
                logDict[key] = val
                i++
            } else {
                break
            }
        }
        m = asl_next(r)
        logs.append(logDict)
    }
    asl_release(r)
    return logs
}
查看更多
一夜七次
3楼-- · 2019-01-06 10:06

The older way people suggested work perfectly till iOS 9 but that will not work with iOS 10/XCode8.

There is a new way of logging introduces in iOS10/XCode8, Unified Logging and Activity Tracing.

https://developer.apple.com/reference/os/1891852-logging#1682426 https://developer.apple.com/videos/play/wwdc2016/721/

User this for logging:

https://github.com/SRGSSR/srglogger-ios

查看更多
虎瘦雄心在
4楼-- · 2019-01-06 10:08

As of IOS 7, this method won't work any more. Apple removed access to ASL due to security reason.

查看更多
来,给爷笑一个
5楼-- · 2019-01-06 10:11

This entry in the Cocoanetics blogs has sample code to access the system log on iOS using the ASL (Apple System Logger) API (man page):

aslmsg q, m;
int i;
const char *key, *val;

q = asl_new(ASL_TYPE_QUERY);

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);

Note that you need to poll ASL to read the latest messages. The code above will also fail when ran on the iPhone simulator, but works just fine on an actual device.

If you don't want to fight the C ASL API, have a look at this Objective-C wrapper called ASLogger.

查看更多
登录 后发表回答