2013-09-02 5 views
2

Je développe une classe logger pour mon application. NSLog sera imprimé uniquement en mode débogage. J'ai personnalisé le NSLog où le nom du fichier source, le numéro de ligne du code source, le nom de la classe et la méthode où NSLog() a été appelé est imprimé. C'est, mon NSLog actuelle ressemble (ClassName MethodName) (SourceFileName: LineNumber) Sortie NSLogComment passer les valeurs des paramètres au NSLOG personnalisé

Maintenant, je veux vous connecter, les valeurs des paramètres du methodname. Comment obtenir ces valeurs de paramètres dans NSLog ??? Je veux la sortie comme (ClassName MethodName) (SourceFileName: LineNumber) (valeurs des paramètres) Sortie NSLog

Répondre

0


pour l'enregistrement poignée personnalisée, vous pouvez utiliser ou consulter le lien suivant.
Vous pouvez personnaliser Lumberjack selon vos besoins.

Lumberjack error logging for ios
Lumberjack error logging tutorial

+1

Bûcheron cadre de l'exploitation forestière est le cadre d'un tiers droit ??? Je ne veux pas utiliser un framework tiers – user1913341

+0

Oui, mais Lumberjack est une bibliothèque open source pour la journalisation et vous pouvez utiliser des codes à partir de ceci dans vos propres programmes.
sinon vous pouvez suivre ce lien pour la connexion personnalisée [lien ici] (http://weakreference.wordpress.com/2011/06/22/overriding-nslog-on-ios/) –

+0

Merci .. Je ne sais pas si la bibliothèque open source est acceptée dans mon application. J'ai créé a spécifié dans ce lien, mais je veux enregistrer mes valeurs de paramètres comme je l'ai mentionné plus tôt dans ma question. – user1913341

3

Quelque chose comme cela devrait fonctionner

#define InstanceLog(fmt, ...) NSLog(@"(%@.%@)(%s:%d) " fmt, NSStringFromClass(self.class), NSStringFromSelector(_cmd), __FILE__, __LINE__, ##__VA_ARGS__) 

Vous pouvez l'utiliser comme NSLog dans les méthodes Objective-C

InstanceLog(@"simple string"); 
InstanceLog(@"%@ %@", @"hello", @"world"); 
+0

Cela ne fonctionnera pas; fmt sera inséré dans la chaîne résultante sans être formaté avec VA_ARGS. Vous aurez besoin d'un [NSString stringWIthFormat:] supplémentaire là-dedans. – bbum

+0

@bbum merci. eu un mauvais jeton de macro: il devrait être '##', pas '#' avant '' __VA_ARGS__' – hoha

+0

Cela ne marchera pas non plus. Vous devez évaluer fmt + __VA_ARGS__ séparément. – bbum

2

Il n'y a pas un moyen de introspecte automatiquement les valeurs transmises à une méthode . Même dans les builds DEBUG (où l'optimiseur est à l'écart), toute tentative d'écriture de code pour introspecter dit que iVars va être incroyablement complexe (vous devrez plonger dans les tables de symboles, extraire les offsets, etc., puis essayer et trouver les arguments qui ont probablement été détruits dans la tentative de les attraper).

Donc, non, pas moyen de vraiment automatiser ça. En général, cependant, un tel mécanisme de journalisation générerait une quantité de sortie tellement énorme que vous feriez mieux de créer (potentiellement uniquement en débogage) une journalisation configurable et parfaitement adaptée à votre application.


Vous pouvez passer des arguments comme ceci (grâce à @hoha pour la version plus simple).

#import <Foundation/Foundation.h> 

#define FooLog(fmt, ...) NSLog(@"(%s): %@", __PRETTY_FUNCTION__, ## __VA_ARGS__) 

@interface Bob:NSObject 
@end 
@implementation Bob 
- (void)yourUncle 
{ 
    FooLog(@"%@", self); 
} 
@end 

int main(int argc, char *argv[]) { 
    @autoreleasepool { 
     NSString *w = @"World"; 
     FooLog(@"Hello, %@!", w); 
     [[Bob new] yourUncle]; 
    } 
} 

Sortie:

2013-09-02 10:51:49.447 Untitled[60967:507] (int main(int, char **)): Hello, World! 
2013-09-02 10:51:49.453 Untitled[60967:507] (-[Bob yourUncle]): <Bob: 0x7fde8840a490> 
Questions connexes