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 {\
}

アクティブ化/非アクティブ化する場合は、のオブジェクト値「UseDebug」を変更するだけ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 に答える