Seit einiger Zeit verwende ich eine Seite mit Makros, die von mehreren oben übernommen wurden. Mein Fokus liegt auf der Anmeldung in der Konsole, wobei der Schwerpunkt auf kontrollierter und gefilterter Ausführlichkeit liegt . Wenn Ihnen viele Protokollzeilen nichts ausmachen, Sie aber Stapel von ihnen einfach ein- und ausschalten möchten, ist dies möglicherweise hilfreich.
Zuerst ersetze ich optional NSLog durch printf, wie oben von @Rodrigo beschrieben
#define NSLOG_DROPCHAFF//comment out to get usual date/time ,etc:2011-11-03 13:43:55.632 myApp[3739:207] Hello Word
#ifdef NSLOG_DROPCHAFF
#define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#endif
Als nächstes schalte ich die Anmeldung ein oder aus.
#ifdef DEBUG
#define LOG_CATEGORY_DETAIL// comment out to turn all conditional logging off while keeping other DEBUG features
#endif
Definieren Sie im Hauptblock verschiedene Kategorien , die Modulen in Ihrer App entsprechen. Definieren Sie auch eine Protokollierungsstufe , über der Protokollierungsaufrufe nicht aufgerufen werden. Dann definieren verschiedene Aromen von NSLog Ausgang
#ifdef LOG_CATEGORY_DETAIL
//define the categories using bitwise leftshift operators
#define kLogGCD (1<<0)
#define kLogCoreCreate (1<<1)
#define kLogModel (1<<2)
#define kLogVC (1<<3)
#define kLogFile (1<<4)
//etc
//add the categories that should be logged...
#define kLOGIFcategory kLogModel+kLogVC+kLogCoreCreate
//...and the maximum detailLevel to report (use -1 to override the category switch)
#define kLOGIFdetailLTEQ 4
// output looks like this:"-[AppDelegate myMethod] log string..."
# define myLog(category,detailLevel,format, ...) if(detailLevel<0 || ((category&kLOGIFcategory)&&detailLevel<= kLOGIFdetailLTEQ)) {NSLog((@"%s " format), __PRETTY_FUNCTION__, ##__VA_ARGS__);}
// output also shows line number:"-[AppDelegate myMethod][l17] log string..."
# define myLogLine(category,detailLevel,format, ...) if(detailLevel<0 || ((category&kLOGIFcategory)&&detailLevel<= kLOGIFdetailLTEQ)) {NSLog((@"%s[l%i] " format), __PRETTY_FUNCTION__,__LINE__ ,##__VA_ARGS__);}
// output very simple:" log string..."
# define myLogSimple(category,detailLevel,format, ...) if(detailLevel<0 || ((category&kLOGIFcategory)&&detailLevel<= kLOGIFdetailLTEQ)) {NSLog((@"" format), ##__VA_ARGS__);}
//as myLog but only shows method name: "myMethod: log string..."
// (Doesn't work in C-functions)
# define myLog_cmd(category,detailLevel,format,...) if(detailLevel<0 || ((category&kLOGIFcategory)&&detailLevel<= kLOGIFdetailLTEQ)) {NSLog((@"%@: " format), NSStringFromSelector(_cmd), ##__VA_ARGS__);}
//as myLogLine but only shows method name: "myMethod>l17: log string..."
# define myLog_cmdLine(category,detailLevel,format, ...) if(detailLevel<0 || ((category&kLOGIFcategory)&&detailLevel<= kLOGIFdetailLTEQ)) {NSLog((@"%@>l%i: " format), NSStringFromSelector(_cmd),__LINE__ , ##__VA_ARGS__);}
//or define your own...
// # define myLogEAGLcontext(category,detailLevel,format, ...) if(detailLevel<0 || ((category&kLOGIFcategory)&&detailLevel<= kLOGIFdetailLTEQ)) {NSLog((@"%s>l%i (ctx:%@)" format), __PRETTY_FUNCTION__,__LINE__ ,[EAGLContext currentContext], ##__VA_ARGS__);}
#else
# define myLog_cmd(...)
# define myLog_cmdLine(...)
# define myLog(...)
# define myLogLine(...)
# define myLogSimple(...)
//# define myLogEAGLcontext(...)
#endif
Mit den aktuellen Einstellungen für kLOGIFcategory und kLOGIFdetailLTEQ kann ein Anruf wie
myLogLine(kLogVC, 2, @"%@",self);
wird gedruckt, aber das wird nicht
myLogLine(kLogGCD, 2, @"%@",self);//GCD not being printed
noch wird
myLogLine(kLogGCD, 12, @"%@",self);//level too high
Wenn Sie die Einstellungen für einen einzelnen Protokollaufruf überschreiben möchten, verwenden Sie eine negative Ebene:
myLogLine(kLogGCD, -2, @"%@",self);//now printed even tho' GCD category not active.
Ich finde, dass die wenigen zusätzlichen Zeichen für die Eingabe jeder Zeile so viel wert sind, wie ich kann
- Schalten Sie eine ganze Kategorie von Kommentaren ein oder aus (z. B. melden Sie nur die mit Modell gekennzeichneten Anrufe).
- Bericht über feine Details mit höheren Nummern oder nur die wichtigsten Anrufe mit niedrigeren Nummern
Ich bin mir sicher, dass viele dies als etwas übertrieben empfinden werden, aber nur für den Fall, dass jemand findet, dass es zu ihren Zwecken passt.