web-dev-qa-db-fra.com

Utilisation d'objectif C pour lire les messages de journal publiés sur la console du périphérique

Comment mon application iOS peut-elle lire les messages à partir du journal de la console du périphérique? Je souhaite lire par programme ces entrées de journal (comme la lecture d'un fichier?), En sélectionner quelques-unes et les envoyer par e-mail à l'assistance.

Je connais une application iPhone qui vous permet d'afficher le journal. Son nom est la console. Cependant, je ne peux pas comprendre quelles classes ou API il a utilisées. Une personne a suggéré que cela avait été fait en utilisant les fonctions ASL, mais je ne sais pas ce que c'est ni où elles sont documentées.

Je connais également plusieurs alternatives à l'utilisation de NSLog, telles que NSLogger et CocoaLumberJack, mais nous ne sommes pas prêts à les implémenter pour le moment.

Merci beaucoup pour toute aide!

30

Cette entrée dans les blogs de Cocoanetics contient un exemple de code pour accéder au journal système sur iOS à l'aide de l'API ASL (Apple System Logger) ( page de manuel ):

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

Notez que vous devez interroger ASL pour lire les derniers messages. Le code ci-dessus échouera également lorsqu'il sera exécuté sur le simulateur iPhone, mais fonctionnera parfaitement sur un appareil réel.

Si vous ne voulez pas combattre l'API C ASL, jetez un œil à cet encapsuleur Objective-C appelé ASLogger .

28
Julio Gorgé

À partir de IOS 7, cette méthode ne fonctionnera plus. Apple a supprimé l'accès à l'ASL pour des raisons de sécurité.

7
Trung

Voici une implémentation de Swift si quelqu'un en cherche une:

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
Harlan Haskins

L'ancienne façon de travailler suggérée fonctionnait parfaitement jusqu'à iOS 9, mais cela ne fonctionnerait pas avec iOS 10/XCode8.

Il existe une nouvelle méthode de journalisation introduite dans iOS10/XCode8, la journalisation unifiée et le suivi des activités.

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

Utilisateur ceci pour l'enregistrement:

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

0
Nilesh