在我的iOS项目中,我使用了一个第三方库,但是它会在控制台输出中大量地产生垃圾信息。我能否对调试输出应用任何过滤方式?
#define NSLog(args...) [[Logger singleton] debugWithLevel:kDebug line:__LINE__ funcName:__PRETTY_FUNCTION__ message:args];
// poor man's nslog
@interface Logger : NSObject
typedef enum {
kTrace=0, kDebug=1, kInfo=2, kWarn=3, kError=4, KSilent=5
} LoggerLevel;
// ...
@implementation Logger
+(Logger *)singleton {
static dispatch_once_t pred;
static Logger *shared = nil;
dispatch_once(&pred, ^{
shared = [[Logger alloc] init];
shared.logThreshold = kTrace;
});
return shared;
}
-(void) debugWithLevel:(LoggerLevel)level
line:(int)line
funcName:(const char *)funcName
message:(NSString *)msg, ... {
va_list ap;
va_start (ap, msg);
msg = [[[NSString alloc] initWithFormat:msg arguments:ap] autorelease];
va_end (ap);
msg = [NSString stringWithFormat:@"%s %50s:%3d - %@", levelName[level], funcName, line, msg];
// ... filter by class name ...
fprintf(stdout,"%s\n", [msg UTF8String]);
}
@end
funcName
包含发送消息的类名和方法。如果库里的类有前缀,且它是一个好公民,那么当 className 以该前缀开始时,请忽略输出。否则,在 fprintf 行之前必须加载该库中的类列表并进行检查。这要看您是直接在项目中使用第三方库的源代码还是二进制库。
如果您使用的是源代码,建议检查它们用于记录消息的方式。可能有一种方法可以减少冗余信息。如果他们仅使用NSLog
,那么唯一的选择就是重新定义NSLog
以进行一些过滤,正如Jano所建议的那样。
如果他们使用像printf
之类的低级函数,则最好的选择是将它们替换为自己的自定义日志宏,例如:
#ifdef DEBUG_3P
#define LOG_3P(str) NSLog(@"%s", str)
#else
#define LOG_3P(str) /* nothing */
#endif
printf("a c string message")
替换为LOG_3P("a c string message")
。您需要自定义解决方案,调整宏参数甚至添加几个宏以适应您的情况。并进行一些搜索和替换,直到它正常工作。DEBUG_3P
为C标志:-D DEBUG_3P
,否则它将被静音。print()
命令发送到控制台的第三方文本吗? - Mihai Fratu
MCLog
正好符合我的需求。 - ArtFeel