2011-10-26 9 views
13

私のiOSプロジェクトでは、1台のサードパーティライブラリを使用しています。デバッグ出力にフィルタリングを適用できますか?Xcodeでコンソール出力をフィルタリングする方法

+1

実際の解決策ではないかもしれませんが、[MCLog](https://github.com/yuhua-chen/MCLog)は出力フィルタリングを可能にするXCodeプラグインです。 – david

+0

@david Thx、「MCLog」は私が必要とするものを正確に実行するので、私はこのコメントを最良の答えとして受け入れるべきです。 – ArtFeel

+0

答えとして私のコメントをコピーしました。 – david

答えて

4

ライブラリがNSLogを使用している場合、ライブラリを再定義して、ライブラリからのログメッセージを破棄できます。例コード:

#define NSLog(args...) [[Logger singleton] debugWithLevel:kDebug line:__LINE__ funcName:__PRETTY_FUNCTION__ message:args]; 

// poor man's nslog 
@interface Logger : NSObject 

typedef enum { 
    kTrace=0, kDebug=1, kInfo=2, kWarn=3, kError=4, KSilent=5 
} LoggerLevel; 


// ... 

@implementation Logger 

+(Logger *)singleton { 
    static dispatch_once_t pred; 
    static Logger *shared = nil; 
    dispatch_once(&pred, ^{ 
     shared = [[Logger alloc] init]; 
     shared.logThreshold = kTrace; 
    }); 
    return shared; 
} 
-(void) debugWithLevel:(LoggerLevel)level 
        line:(int)line 
       funcName:(const char *)funcName 
       message:(NSString *)msg, ... { 

    va_list ap;   
    va_start (ap, msg); 
    msg = [[[NSString alloc] initWithFormat:msg arguments:ap] autorelease]; 
    va_end (ap);   

    msg = [NSString stringWithFormat:@"%s %50s:%3d - %@", levelName[level], funcName, line, msg]; 

    // ... filter by class name ... 

    fprintf(stdout,"%s\n", [msg UTF8String]); 
} 
@end 

funcNameには、メッセージを送信するクラス名とメソッドが含まれています。ライブラリが良い市民で、接頭辞で始まるクラスを持っている場合は、classNameがそれで始まる場合は出力を破棄します。それ以外の場合は、そのライブラリからクラスのリストをロードし、fprintf行の前にチェックする必要があります。

もちろん、NSLogと同じようにログをsyslogdに複製するのではなく、誰が気にしますか。 :P

3

これは、プロジェクトまたはバイナリライブラリでサードパーティライブラリのソースコードを直接使用しているかどうかによって異なります。

ソースコードを使用している場合は、メッセージの記録に使用しているものを確認することをお勧めします。冗長性を減らす方法があるかもしれません。彼らが平文NSLogを使用している場合、唯一の選択肢は、Janoが提案したように、フィルタリングを行うためにNSLogを再定義することです。

彼らはprintfなどのような低レベルの機能を使用している場合は、あなたの最良のオプションは、独自のカスタムログマクロに置き換える、などのことです。

#ifdef DEBUG_3P 
    #define LOG_3P(str) NSLog(@"%s", str) 
#else 
    #define LOG_3P(str) /* nothing */ 
#endif 

その後、LOG_3P("a c string message")printf("a c string message")を交換してください。あなたは、ソリューションをカスタマイズしたり、マクロパラメータを調整したり、場合に応じていくつかのマクロを追加したりする必要があります。それが動作するまで、いくつかの検索と置換を行います。

サードパーティライブラリのログを表示するには、Cフラグ:-D DEBUG_3Pとしてビルド設定にDEBUG_3Pを定義するだけです。それ以外の場合はミュートになります。

バイナリライブラリを使用している場合は、リリース設定でビルドするだけで、ログの冗長性を最小限に抑えるか、減らすことができます。

+0

私はC言語で書かれたソースコードライブラリを使い、printf()、vprintf()、そしてputs()を使ってロギングします。 – ArtFeel

+0

その場合、あなた自身のロギングマクロでそれらを置き換えない限り、私はあなたが*容易に*出力を傍受できないのではないかと思います。私の更新された答えを見てください。 – djromero

3

Swiftの場合、私はprint()のまわりにこれを行うラッパーを記述しました。ここをクリックしてください:https://github.com/SebastianMecklenburg/TagLog

これは、デバッグメッセージにタグを追加し、それらのタグで出力をフィルタリングすることによって機能します。これはコード内で動作し、Xcodeプラグインは必要ありません。

+0

'print()'コマンドでコンソールに送信されるサードパーティのテキストをフィルタリングしますか? –

関連する問題