在Xcode中,有没有办法在调用NSLog时禁用调试器控制台中出现的时间戳?

时间:2009-08-30 19:40:25

标签: xcode console debugging settings

Xcode的调试器控制台可以轻松查看我的应用程序使用NSLog()发送的任何调试消息,但它始终在其上添加时间戳前缀:

2009-08-30 04:54:48.128 MyApp[94652:a0f] some log message
2009-08-30 04:54:50.647 MyApp[94652:a0f] another log message
...

我没有使用这个前缀,它占用了很多空间。我有一种感觉它被硬编码到Apple的日志记录系统中,但以防万一有解决方案:

我可以让调试器控制台向我显示没有时间戳前缀的日志消息吗?

这样的事情会很完美:

some log message
another log message
...

8 个答案:

答案 0 :(得分:24)

NSLog()就是这样做的,而不是调试器控制台。

避免它的最简单方法是根本不使用NSLog。你可以使用fprintf(),但这很痛苦,因为它不支持%@格式类型。

我通常会为此写一个函数:

void MyLog(NSString *format, ...) {
    va_list args;
    va_start(args, format);
    NSString *formattedString = [[NSString alloc] initWithFormat: format
                                                  arguments: args];
    va_end(args);
    [[NSFileHandle fileHandleWithStandardOutput]
        writeData: [formattedString dataUsingEncoding: NSNEXTSTEPStringEncoding];
    [formattedString release];
}

显然,修改它以添加换行符或使用更短的前缀等...

(修正了迷路ctrl-b)

答案 1 :(得分:11)

定义宏

#if __has_feature(objc_arc)
  #define MDLog(format, ...) CFShow((__bridge CFStringRef)[NSString stringWithFormat:format, ## __VA_ARGS__]);
#else
  #define MDLog(format, ...) CFShow([NSString stringWithFormat:format, ## __VA_ARGS__]);
#endif

在代码中使用此宏,如

NSLog(@"some log message");
MDLog(@"some log message");

这是控制台的输出

NSLog-> 2014-01-28 10:43:17.873 TestApp[452:60b] some log message
MDLog - > some log message


P.S。

如果有人想要自定义日志,它会为您提供更多信息,如方法名称/行号等,可以下载开源MLog.h on GitHub

答案 2 :(得分:9)

在.pch文件中输入这一行代码,然后就完成了

#define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);

注意##部分

答案 3 :(得分:6)

将结合bbum的答案继续使用NSLog的一种方法是使用预处理器宏将NSLog重新定义为您自己的函数

#define USECUSTOMLOGS 1
#ifdef USECUSTOMLOGS
#define NSLog MyLog
#endif

这将在编译时将NSLog替换为MyLog。基本上你可以随处使用NSLog,它仍然会在控制台窗口中使用你的自定义格式。您也可以通过将1更改为0来随时将其更改为使用NSLog。

答案 4 :(得分:4)

ARC版本:

void NFLog(NSString *format, ...)
{
    va_list args;
    va_start(args, format);
    NSString *formattedString = [NSString stringWithFormat:format, args];
    formattedString = [formattedString stringByAppendingString:@"\n"];
    va_end(args);
    [[NSFileHandle fileHandleWithStandardOutput] writeData: [formattedString dataUsingEncoding: NSUTF8StringEncoding]];
}

更新

我正在做的是将此代码添加到xxx-Prefix.pch然后您可以在任何地方使用它:

#define newLine         do { [(NSFileHandle*)[NSFileHandle fileHandleWithStandardOutput] writeData:[@"\n" dataUsingEncoding: NSUTF8StringEncoding]]; } while(0);
#define NFLog(args,...) do { [(NSFileHandle*)[NSFileHandle fileHandleWithStandardOutput] writeData:[[NSString stringWithFormat:args, ##__VA_ARGS__] dataUsingEncoding: NSUTF8StringEncoding]]; } while(0); newLine

如果你想要NSLog回来:

#define NFLog(args,...) NSLog(args,##__VA_ARGS__)

答案 5 :(得分:1)

在控制台窗口的左上角有一个下拉菜单,显示所有输出/调试器输出/目标输出。

选择目标输出。它适用于我的旧版Xcode,但说实话,它不适用于我当前的4.3版本。

我希望这会对你有所帮助。

JR

答案 6 :(得分:1)

这比建议的解决方案更容易。使用粗略的解决方案并添加更多一点,使其在发布版本上的日志条目只有你得到下面的宏。只需将此宏添加到标头或.pch文件即可。启用DEBUG标志时,此宏将显示日志条目,在发布版本中,您将看不到日志条目。

#ifdef DEBUG
#define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#define Log(x, ...) NSLog(@"%s %d: " x, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#else
#define Log(x, ...)
#endif

答案 7 :(得分:1)

清除日志宏

这是我为此目的制作的宏。它的工作原理与NSLog完全一样,但是只包含您的文本,没有任何额外的信息


宏(粘贴到您的.h文件中)

dark.exe Setup.msi -x Files

示例用法:

#define CLog(__string, ...) fprintf(stderr, "\n%s", [([NSString stringWithFormat:__string, ##__VA_ARGS__]) UTF8String])

日志:

CLog(@"I am %i days and %i years old", 3, 7);