web-dev-qa-db-ja.com

コンソールとファイルの両方へのNSLog()

NSog()をファイルにリダイレクトしたいのですが、それでもコンソールに出力が表示されます。 stderrは、次を使用してファイルにリダイレクトできることを認識しています。

_freopen("file.log", "a+", stderr);
_

ただし、ファイルにリダイレクトすると、ログはコンソール出力に表示されなくなります。

NSLog()の周りにカスタムラッパーを構築することはできますが、アプリのクラッシュ時にstderrに書き込まれるログに記録されたクラッシュログを取得できませんでした。

また、ファイル記述子を複製するためのdup()やその他のメソッドを試していましたが、出力はファイルまたはコンソールのエーテルであり、両方ではありませんでした。

同様の質問がここで尋ねられました: iPhoneのstderrをファイルとコンソールの両方に書き込みます しかし、受け入れられた答えがないか、NSLog()ラッパーを使用することを提案します。

この作業を管理する方法について誰かアイデアがありますか?よろしくお願いします。

UPDATE:リダイレクトの最も重要な部分は、システムエラーログ(stderr)コンソールとファイルの両方に書き込まれます。

25
Miroslav Kovac

ドキュメントによると 、カスタムログ機能が必要になります。

少なくとも、可変個引数を取り、NSLogとfprintfに出力する次のような関数が必要です。

void myLog(NSString* format, ...)
{
    va_list argList;
    va_start(argList, format);
    NSString* formattedMessage = [[NSString alloc] initWithFormat: format arguments: argList];
    va_end(argList);
    NSLog(@"%@", formattedMessage);
    fprintf(myFileDescriptor, "%s\n", [formattedMessage UTF8String]);
    [formattedMessage release]; // if not on ARC
}

または、Cocoaロギングフレームワークがあります。

特定のCocoaロギングフレームワークを探しています

8
JeremyP

私たちが実装した方法は次のとおりです。

if (!isatty(STDERR_FILENO)) {
    // Redirection code
}

これは、コンソールが接続されている場合、すでにデバッグしているため、これらのログをファイルに保存する必要がないという一般的な仮定に基づいています。したがって、コンソールが接続されると、ログがそこに出力されます。それ以外の場合は、ファイルに保存されます。

29
Sailesh