在我的iOS项目中,我使用了一个第三方库,这是令人难以置信的垃圾邮件进入控制台输出。我可以应用任何过滤来调试输出。
答案 0 :(得分:5)
如果库正在使用NSLog,您可以重新定义它并在它来自库时丢弃日志消息。示例代码:
#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那样将日志复制到syslogd,但谁在乎呢。 :P
答案 1 :(得分:3)
这取决于您是否直接在项目或二进制库中使用第三方库源代码。
如果您正在使用源代码,我建议您检查用于记录消息的内容。它可能有办法减少冗长。如果他们使用普通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
,否则将为静音。
如果您正在使用二进制库,则可以使用其发布配置构建它,禁用或将日志详细程度降至最低。
答案 2 :(得分:3)
适用于Xcode 5.0到7.3,Apple no longer supports Xcode plug-ins as of Xcode 8.0。
MCLog应该是您正在寻找的。 p>
这是一个XCode插件。
答案 3 :(得分:2)
对于Swift,我写了一个围绕print()的包装器。见这里:https://github.com/SebastianMecklenburg/TagLog
它的工作原理是添加标签来调试消息,然后通过这些标签过滤输出。它适用于所有代码,不需要Xcode插件。