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
...
答案 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
如果有人想要自定义日志,它会为您提供更多信息,如方法名称/行号等,可以下载开源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);