我目前正在使用以下DebugLog宏
#if defined(DEBUG) && defined(useDebugLogs)
#define DebugLog( s, ... ) NSLog( @"<%s:(%d)> %@", __PRETTY_FUNCTION__, __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
#define DebugLog( s, ... )
#endif
然而,现在测试飞行允许远程记录,这有点过时了。
基本上我想要做的是在settings.plist中添加一个开关,以允许用户打开远程日志记录。
我遇到过这个教程 http://jomnius.blogspot.com/2011/09/how-to-do-dynamic-debug-logging-in.html
然而,这是一个非常糟糕的解释,实际上似乎没有用。
答案 0 :(得分:3)
好吧,IMO的最佳方式是始终发送日志并调整您的实施,以便您准确地看到您想要的内容。你要么想要分析,要么你不会使用它们。有错误,或者没有。通过他们的方式,提高你的信噪比。反正...
您可以为此目的创建专用功能。它可以根据您实现中的某个变量有条件地记录或不记录。请注意,您可以通过调用NSLogv
而不是NSLog
来转发您的va_list,或者您可以使用-[NSString initWithFormat:arguments:]
在其他位置转发消息+参数:
<强> MONDebugLog.h 强>
extern void MONDebugLog(NSString * format, ... ) NS_FORMAT_FUNCTION(1,2);
<强> MONDebugLog.m 强>
void MONDebugLog(NSString * format, ... ) {
enum {
MONLog_Undefined,
MONLog_Enable,
MONLog_Disable
};
static int DoLog = MONLog_Undefined;
if (MONLog_Undefined == DoLog) {
DoLog = ...load from plist or defaults and set to Log_Enable or Log_Disable...;
}
if (MONLog_Disable == DoLog) {
return;
}
va_list arguments;
va_start(arguments, format);
NSString * str = [[NSString alloc] initWithFormat:format arguments:arguments];
va_end(arguments);
...now log or xmit str...
}
答案 1 :(得分:2)
如果您想要做的只是打开或关闭日志记录,那么这是一个简单而强大的解决方案。我们的想法是将stderr重定向到/ dev / null:
#include <fcntl.h>
#include <unistd.h>
void setLoggingEnabled(BOOL enabled)
{
static int copyOfStdErr = -1;
if (enabled) {
if (copyOfStdErr == -1)
return;
dup2(copyOfStdErr, STDERR_FILENO);
close(copyOfStdErr);
copyOfStdErr = -1;
} else {
if (copyOfStdErr != -1)
return;
copyOfStdErr = dup(STDERR_FILENO);
int fd = open("/dev/null", O_WRONLY);
dup2(fd, STDERR_FILENO);
close(fd);
}
}
这个解决方案有一些优点:
NSLog
答案 2 :(得分:1)
您可以尝试这样的事情:
#define boolDebug_IsActivated [[NSUserDefaults standardUserDefaults] boolForKey:@"UseDebug"]
#define DebugLog( s, ... ) \
if (boolDebug_IsActivated) {\
NSLog( @"<%s:(%d)> %@", __PRETTY_FUNCTION__, __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] );\
} \
else {\
}
如果要激活/取消激活,只需在NSUserDefaults
中更改对象值“UseDebug”。
示例:
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:NO] forKey:@"UseDebug"];
DebugLog(@"comment that should not appear");
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:@"UseDebug"];
DebugLog(@"comment that should appear");