В течение некоторого времени я использовал сайт макросов, взятых из нескольких выше. Мой фокус на регистрации в консоли, с упором на контролируемую и отфильтрованную детализацию ; если вы не возражаете против большого количества строк журнала, но хотите легко включать и выключать их, тогда это может оказаться полезным.
Во-первых, я необязательно заменяю 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.
Я считаю, что несколько дополнительных символов ввода каждой строки стоят, как я могу тогда
- Включить или отключить целую категорию комментариев (например, сообщать только о тех вызовах, помеченных как Модель)
- отчет о мелкой детализации с номерами более высокого уровня или только о самых важных вызовах, отмеченных номерами более низкого уровня
Я уверен, что многие найдут это немного излишним, но на всякий случай, если кто-то найдет, что это соответствует их целям ..