2012-03-08 10 views
23

NSog()をファイルにリダイレクトしたいのですが、それでもコンソールの出力を確認したいと思います。コンソールとファイルの両方へのNSLog()

freopen("file.log", "a+", stderr); 

が、ファイルにリダイレクトした後、ログはこれ以上のコンソール出力に示されている: 私はstderrを使用してファイルにリダイレクトすることができることを承知していません。

私はNSLog()の周りにカスタムラッパーを構築できましたが、クラッシュログはログに記録されず、アプリケーションクラッシュの瞬間にstderrに書き込まれます。

私はdup()とファイル記述子を複製するための他の方法も試していましたが、出力はファイル内またはコンソール内ではなく、両方ではありませんでした。

類似の質問がここで尋ねられました: Write stderr on iPhone to both file and console 受け入れられた回答、またはNSLog()ラッパーの使用に関する提案なし。

誰でもこの作品の管理方法について考えていますか? Thanxは事前に

UPDATE:リダイレクトの最も重要な部分は、コンソールとファイルの両方に書き込まれたシステム・エラー・ログ(標準エラー出力)を持つことです。

+0

2つの別々のログを作成し、1つをファイルに送信し、もう1つをコンソールに送信するが、それらを同じにしておくとどうでしょうか? – JTApps

+0

これをどのように管理することをお勧めしますか?最も重要なことは、コンソールとファイルの両方にシステムエラーログを書き込むことです。 –

+2

NSLogはデフォルトでコンソールにログを記録しますが、そこからログを抽出することもできます。http://stackoverflow.com/questions/7150849/how-can-i-get-a-console-readout-at-runtime-in -an-application/7151773#7151773 – Joe

答えて

8

According to the docsの場合、カスタムログ機能が必要です。

あなたは最低でも必要、のNSLogとfprintfのようなものに可変長引数とprintdを取る機能:

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 
} 

又はココアロギングフレームワークがあります。

Looking for a Specific Cocoa Logging Framework

+0

ありがとう、これは良いですが、私はコンソールとファイルの両方にシステムのstderrログを取得するためのいくつかの方法を探していますが、私のカスタムログだけではありません。ありがとう。 –

+0

@Miroslav:私はあなたに与えたものに似たような変更がなければそれは可能ではないと思います。 – JeremyP

25

我々が実装されている方法は次のとおりです。

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

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

+0

恐ろしい!これはまさに私が必要としていたものです!ありがとうSailesh。 –

関連する問題