Якийсь час я використовую сайт макросів, прийнятих з декількох вище. Моє фокусування на вході в консоль, з акцентом на контрольоване та відфільтроване багатослів’я ; якщо ви не заперечуєте проти великої кількості ліній журналів, але хочете легко включати та вимикати партії, то це може бути корисним.
По-перше, я необов'язково замінюю NSLog на printf, як описано вище @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
Далі вмикаю або вимикаю вхід.
#ifdef DEBUG
#define LOG_CATEGORY_DETAIL// comment out to turn all conditional logging off while keeping other DEBUG features
#endif
У головному блоці визначте різні категорії, що відповідають модулям у вашій програмі. Визначте також рівень реєстрації, над яким журнальні дзвінки не будуть викликатися. Потім визначте різні смаки виходу 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
Таким чином, з поточними налаштуваннями для kLOGIFcategory та kLOGIFdetailLTEQ, подібний виклик
myLogLine(kLogVC, 2, @"%@",self);
буде надруковано, але це не буде
myLogLine(kLogGCD, 2, @"%@",self);//GCD not being printed
ні буде
myLogLine(kLogGCD, 12, @"%@",self);//level too high
Якщо ви хочете змінити налаштування для окремого дзвінка журналу, використовуйте негативний рівень:
myLogLine(kLogGCD, -2, @"%@",self);//now printed even tho' GCD category not active.
Я вважаю, що кілька зайвих символів введення кожного рядка варті того, наскільки я можу тоді
- Увімкнення та вимкнення всієї категорії коментарів (наприклад, повідомляйте лише про ті дзвінки, позначені Моделі)
- повідомляти про детальні деталі з номерами вищого рівня або лише про найважливіші дзвінки, позначені нижчими номерами
Я впевнений, що багато хто знайде це трохи непосильним, але про всяк випадок, коли хтось виявить, що це відповідає їхнім цілям.