Od pewnego czasu korzystam z witryny makr przyjętych z kilku powyższych. Skupiam się na logowaniu w konsoli, z naciskiem na kontrolowaną i filtrowaną gadatliwość ; jeśli nie masz nic przeciwko wielu wierszom dziennika, ale chcesz łatwo włączać i wyłączać ich partie, może to być przydatne.
Po pierwsze, opcjonalnie zastępuję NSLog printf, jak opisano powyżej przez @Rodrigo
#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
Następnie włączam lub wyłączam logowanie.
#ifdef DEBUG
#define LOG_CATEGORY_DETAIL// comment out to turn all conditional logging off while keeping other DEBUG features
#endif
W głównym bloku zdefiniuj różne kategorie odpowiadające modułom w swojej aplikacji. Określ także poziom rejestrowania , powyżej którego rejestrowanie połączeń nie będzie wywoływane. Następnie zdefiniuj różne smaki wyników NSLog
#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
Zatem przy obecnych ustawieniach dla kLOGIFcategory i kLOGIFdetailLTEQ, połączenie takie jak
myLogLine(kLogVC, 2, @"%@",self);
wydrukuje, ale nie będzie
myLogLine(kLogGCD, 2, @"%@",self);//GCD not being printed
nie będzie
myLogLine(kLogGCD, 12, @"%@",self);//level too high
Jeśli chcesz zastąpić ustawienia dla pojedynczego połączenia dziennika, użyj poziomu ujemnego:
myLogLine(kLogGCD, -2, @"%@",self);//now printed even tho' GCD category not active.
Uważam, że kilka dodatkowych znaków wpisywania każdej linii jest wartych, jak mogę
- Włącz lub wyłącz całą kategorię komentarza (np. Zgłaszaj tylko połączenia oznaczone jako Model)
- melduj o szczegółach za pomocą numerów wyższego poziomu lub tylko najważniejszych połączeń oznaczonych niższymi numerami
Jestem pewien, że wielu uzna to za przesadę, ale na wypadek, gdyby ktoś uznał, że pasuje to do ich celów ...