【问题标题】:How to filter console output in Xcode如何在 Xcode 中过滤控制台输出
【发布时间】:2011-10-26 07:54:09
【问题描述】:

在我的 iOS 项目中,我使用了一个 3rd-party 库,它在控制台输出中产生了令人难以置信的垃圾邮件。我可以对调试输出应用任何过滤吗?

【问题讨论】:

  • 这可能不是一个真正的解决方案,但MCLog 是一个启用输出过滤的 XCode 插件。
  • @david Thx,我应该接受此评论作为最佳答案,因为 MCLog 正是我需要的。
  • 我已经复制了我的评论作为答案。

标签: xcode console nslog


【解决方案1】:

如果库使用 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

【讨论】:

    【解决方案2】:

    适用于 Xcode 5.0 到 7.3,Apple no longer supports Xcode plug-ins as of Xcode 8.0

    MCLog 应该是您要查找的内容。

    这是一个 XCode 插件。

    【讨论】:

    • 是的......不再工作了。 github问题状态相同,似乎没有人关心
    【解决方案3】:

    这取决于您是在项目中直接使用第 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")。您需要自定义解决方案,调整宏参数,甚至为您的案例添加多个宏。并进行一些搜索和替换,直到它工作为止。

    当您想查看 3rd 方库日志时,只需在构建设置中将 DEBUG_3P 定义为 C 标志:-D DEBUG_3P,否则它将静音。

    如果您使用的是二进制库,您可以使用其发布配置构建它,禁用或将日志详细程度降至最低。

    【讨论】:

    • 我使用 C 编写的源代码库,它使用 printf()、vprintf() 和 puts() 进行日志记录。
    • 在这种情况下,除非您将它们替换为您自己的日志记录宏,否则恐怕您无法轻松截取输出。请参阅我的更新答案。
    【解决方案4】:

    对于 Swift,我为 print() 编写了一个包装器,它就是这样做的。见这里:https://github.com/SebastianMecklenburg/TagLog

    它通过添加标签来调试消息,然后通过这些标签过滤输出。它全部在代码中工作,不需要 Xcode 插件。

    【讨论】:

    • 这会过滤掉通过print() 命令发送到控制台的第三方文本吗?
    • Github 链接现在是 404
    猜你喜欢
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多