कुछ समय के लिए मैं कई ऊपर से अपनाए गए मैक्रोज़ की साइट का उपयोग कर रहा हूं। कंसोल में लॉगिंग पर मेरा ध्यान केंद्रित है, नियंत्रित और फ़िल्टर्ड वर्बोसिटी पर जोर देने के साथ ; यदि आपको बहुत सी लॉग लाइन्स से ऐतराज नहीं है, लेकिन आसानी से उनमें से बैचों को चालू और बंद करना चाहते हैं, तो आपको यह उपयोगी लग सकता है।
सबसे पहले, मैं वैकल्पिक रूप से NSLog को प्रिंट के साथ बदल देता हूं जैसा कि @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.
मुझे लगता है कि प्रत्येक पंक्ति टाइप करने के कुछ अतिरिक्त पात्र हैं जो मैं कर सकता हूं
- पर या बंद टिप्पणी की एक पूरी श्रेणी स्विच करें (उदाहरण के लिए केवल उन मॉडल को रिपोर्ट करें)
- उच्च स्तर की संख्या के साथ ठीक विवरण पर रिपोर्ट या कम संख्या के साथ चिह्नित सबसे महत्वपूर्ण कॉल
मुझे यकीन है कि कई लोग इसे एक ओवरकिल का एक सा पाएंगे, लेकिन अगर कोई इसे अपने उद्देश्यों के अनुरूप पाता है तो बस ..