Trong một thời gian, tôi đã sử dụng một trang web macro được thông qua từ một số ở trên. Tôi tập trung vào việc đăng nhập vào Bảng điều khiển, với sự nhấn mạnh vào tính dài dòng được kiểm soát và lọc ; nếu bạn không bận tâm nhiều dòng nhật ký nhưng muốn dễ dàng bật và tắt hàng loạt chúng, thì bạn có thể thấy điều này hữu ích.
Đầu tiên, tôi tùy ý thay thế NSLog bằng printf như được mô tả bởi @Rodrigo ở trên
#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
Tiếp theo, tôi chuyển sang đăng nhập hoặc tắt.
#ifdef DEBUG
#define LOG_CATEGORY_DETAIL// comment out to turn all conditional logging off while keeping other DEBUG features
#endif
Trong khối chính, xác định các danh mục khác nhau tương ứng với các mô-đun trong ứng dụng của bạn. Cũng xác định một mức ghi nhật ký trên đó các cuộc gọi đăng nhập sẽ không được gọi. Sau đó xác định các hương vị khác nhau của đầu ra 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
Do đó, với các cài đặt hiện tại cho kLOGIFc Category và kLOGIFdetailLTEQ, một cuộc gọi như
myLogLine(kLogVC, 2, @"%@",self);
sẽ in nhưng điều này sẽ không
myLogLine(kLogGCD, 2, @"%@",self);//GCD not being printed
cũng sẽ không
myLogLine(kLogGCD, 12, @"%@",self);//level too high
Nếu bạn muốn ghi đè cài đặt cho một cuộc gọi nhật ký riêng lẻ, hãy sử dụng mức âm:
myLogLine(kLogGCD, -2, @"%@",self);//now printed even tho' GCD category not active.
Tôi thấy một vài ký tự thêm vào mỗi dòng có giá trị như tôi có thể sau đó
- Bật hoặc tắt toàn bộ danh mục nhận xét (ví dụ: chỉ báo cáo những cuộc gọi được đánh dấu Model)
- báo cáo chi tiết tốt với số cấp cao hơn hoặc chỉ các cuộc gọi quan trọng nhất được đánh dấu bằng số thấp hơn
Tôi chắc chắn nhiều người sẽ thấy điều này hơi quá mức, nhưng chỉ trong trường hợp ai đó thấy nó phù hợp với mục đích của họ ..