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

e.J*_*mes 27 debugging console settings xcode

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
...
Run Code Online (Sandbox Code Playgroud)

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

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

像这样的东西是完美的:

some log message
another log message
...
Run Code Online (Sandbox Code Playgroud)

bbu*_*bum 25

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]];

}
Run Code Online (Sandbox Code Playgroud)

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

(修正了迷路ctrl-b)


Ind*_*ore 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
Run Code Online (Sandbox Code Playgroud)

并在你的代码中使用这个宏

NSLog(@"some log message");
MDLog(@"some log message");
Run Code Online (Sandbox Code Playgroud)

这是控制台的输出

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


PS

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


Abh*_*ngh 8

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

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

注意##部分


Col*_*gic 6

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

#define USECUSTOMLOGS 1
#if USECUSTOMLOGS
#define NSLog MyLog
#endif
Run Code Online (Sandbox Code Playgroud)

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


TON*_*y.W 5

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]];
}
Run Code Online (Sandbox Code Playgroud)

更新:

我正在做的是将这段代码添加到 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
Run Code Online (Sandbox Code Playgroud)

如果你想要 NSLog 返回:

#define NFLog(args,...) NSLog(args,##__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)