Bir süredir yukarıdakilerin çoğundan benimsenen bir makro sitesi kullanıyorum. Mayın, kontrollü ve filtrelenmiş ayrıntılara vurgu yaparak Konsolda oturum açmaya odaklanıyor ; Çok fazla günlük satırı sakıncası yoksa ancak gruplarını kolayca açmak ve kapatmak istiyorsanız, bunu yararlı bulabilirsiniz.
İlk olarak, isteğe bağlı olarak yukarıda @Rodrigo tarafından açıklandığı gibi NSLog'u printf ile değiştiriyorum
#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
Ardından, günlüğe kaydetmeyi açıp kapatıyorum.
#ifdef DEBUG
#define LOG_CATEGORY_DETAIL// comment out to turn all conditional logging off while keeping other DEBUG features
#endif
Ana blokta, uygulamanızdaki modüllere karşılık gelen çeşitli kategoriler tanımlayın . Ayrıca, üzerinde günlük aramalarının çağrılmayacağı bir günlük seviyesi de tanımlayın . Ardından NSLog çıktısının çeşitli lezzetlerini tanımlayın
#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
Bu nedenle, kLOGIFcategory ve kLOGIFdetailLTEQ için geçerli ayarlarla,
myLogLine(kLogVC, 2, @"%@",self);
yazdırılacak, ancak bu yazdırılmayacak
myLogLine(kLogGCD, 2, @"%@",self);//GCD not being printed
ne olmayacak
myLogLine(kLogGCD, 12, @"%@",self);//level too high
Tek bir günlük çağrısının ayarlarını geçersiz kılmak istiyorsanız, negatif bir düzey kullanın:
myLogLine(kLogGCD, -2, @"%@",self);//now printed even tho' GCD category not active.
Her satırı yazmanın fazladan birkaç karakterini değerli buluyorum
- Bir yorum kategorisinin tamamını açma veya kapatma (örneğin, yalnızca Model olarak işaretlenmiş çağrıları bildirin)
- daha yüksek seviyeli numaralarla veya yalnızca daha düşük rakamlarla işaretlenmiş en önemli çağrılarla ilgili ince ayrıntıları rapor edin
Eminim birçoğu bunu biraz aşırıya kaçacaktır, ama birinin amacına uygun bulması durumunda ..