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

2019-07-04 03:12发布

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
...

我有没有用这个前缀,它占用了大量的空间。 我有一种感觉是硬编码到苹果公司的记录系统,但万一有一个解决方案在那里:

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

这样的事情将是完美的:

some log message
another log message
...

Answer 1:

的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)的



Answer 2:

定义一个宏

#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


PS

如果有人想自定义日志,让你喜欢的方法名/行号等详细信息可下载的开源MLog.h on GitHub



Answer 3:

把这个一行代码在你的.PCH文件和你做

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

注意##的一部分



Answer 4:

结合使用的NSLog跟上bbum的回答方式是使用预处理宏重新定义的NSLog你自己的功能

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

这将在编译时以mylog替代NSLog的。 基本上,你可以继续使用的NSLog到处,它仍然会使用自定义格式的控制台窗口。 您也可以改回通过改变1到0至NSLog的使用在任何时间。



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

更新:

我做的是这样的代码添加到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__)


Answer 6:

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

选择目标输出。 它的工作对我的旧版本的Xcode的,但说实话跟你不与我目前的4.3版本。

我希望这可以帮助你。

JR



Answer 7:

这比建议的解决方案的方式更容易。 使用carelesslyChoosy的解决方案,并添加一点点,使其登录发布条目只有你得到下面的宏版本。 就在这个宏添加到您的页眉或.PCH文件。 这个宏将显示日志条目时启用调试标志,在发布版本,你不会看到日志条目。

#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


Answer 8:

清理日志宏

下面是我为这个目的而作出的宏。 它的工作原理完全一样的NSLog,但只有文字,没有任何额外的信息


宏(粘贴到您的.h)

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

使用示例:

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

日志:

I am 3 days and 7 years old



文章来源: In Xcode, is there a way to disable the timestamps that appear in the debugger console when calling NSLog?