Há algum tempo eu uso um site de macros adotado por vários acima. Meu foco é fazer logon no console, com ênfase na verbosidade controlada e filtrada ; se você não se importa com muitas linhas de log, mas deseja ativar e desativar lotes com facilidade, pode ser útil.
Primeiro, opcionalmente substituo o NSLog por printf, conforme descrito por @Rodrigo acima
#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
Em seguida, ative ou desative o logon.
#ifdef DEBUG
#define LOG_CATEGORY_DETAIL// comment out to turn all conditional logging off while keeping other DEBUG features
#endif
No bloco principal, defina várias categorias correspondentes aos módulos no seu aplicativo. Defina também um nível de registro acima do qual as chamadas de registro não serão chamadas. Em seguida, defina vários tipos de saída do 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
Assim, com as configurações atuais de kLOGIFcategory e kLOGIFdetailLTEQ, uma chamada como
myLogLine(kLogVC, 2, @"%@",self);
irá imprimir, mas isso não
myLogLine(kLogGCD, 2, @"%@",self);//GCD not being printed
nem vai
myLogLine(kLogGCD, 12, @"%@",self);//level too high
Se você deseja substituir as configurações de uma chamada de log individual, use um nível negativo:
myLogLine(kLogGCD, -2, @"%@",self);//now printed even tho' GCD category not active.
Acho que os poucos caracteres extras de digitação de cada linha valem o máximo que posso
- Ative ou desative uma categoria inteira de comentários (por exemplo, relate apenas as chamadas marcadas como Modelo)
- relate detalhes detalhados com números de nível mais alto ou apenas as chamadas mais importantes marcadas com números mais baixos
Tenho certeza que muitos acharão isso um pouco exagerado, mas no caso de alguém achar que é adequado a seus propósitos ..