2

我目前正在使用以下 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

但是,这是一个非常糟糕的解释,实际上似乎不起作用。

4

3 回答 3

3

好吧,IMO 最好的方法是始终发送日志并调整您的实施,以便您准确地看到您想要的。您要么需要分析,要么不会使用它们。有错误,或者没有。通过它们工作并提高您的信噪比。反正……</p>

您可以为此目的创建一个专用功能。它可以根据您的实现中的某些变量有条件地记录或不记录。请注意,您可以通过调用NSLogv而不是转发您的 va_list NSLog,或者您可以使用-[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...
}
于 2012-04-20T08:23:44.633 回答
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
  • 不涉及预处理器魔法。
  • 它也适用于发出输出的第三方库。
于 2012-04-20T09:31:41.203 回答
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.

例子 :

[[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");
于 2012-04-20T07:45:05.087 回答