บางครั้งฉันก็ใช้ไซต์ของมาโครที่นำมาใช้จากหลายด้านบน ฉันมุ่งเน้นไปที่การเข้าสู่ระบบในคอนโซลโดยเน้นการควบคุมและกรองคำฟุ่มเฟื่อย ; หากคุณไม่ได้สนใจบรรทัดบันทึกข้อมูลจำนวนมาก แต่ต้องการสลับเป็นชุดเปิดหรือปิดได้อย่างง่ายดายคุณอาจพบว่ามีประโยชน์
ก่อนอื่นฉันเลือกแทนที่ 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
ดังนั้นด้วยการตั้งค่าปัจจุบันสำหรับ kLOGIF หมวดหมู่และ kLOGIF รายละเอียด LTEQ การโทรเช่น
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.
ฉันพบว่าอักขระพิเศษไม่กี่ตัวที่พิมพ์แต่ละบรรทัดมีค่าเท่าที่ฉันจะทำได้
- สลับหรือปิดหมวดหมู่ความคิดเห็นทั้งหมด (เช่นรายงานเฉพาะสายที่ทำเครื่องหมายรุ่น)
- รายงานรายละเอียดอย่างละเอียดพร้อมตัวเลขระดับที่สูงขึ้นหรือเพียงแค่การโทรที่สำคัญที่สุดที่มีหมายเลขต่ำกว่า
ฉันแน่ใจว่าหลายคนจะพบว่ามันเกินความจริงเล็กน้อย แต่ในกรณีที่มีคนพบว่ามันเหมาะสมกับวัตถุประสงค์ของพวกเขา ..