2011-09-28 8 views
9

iOSデバイスのNSLog出力をファイルにリダイレクトするための答えはhereです。これはうまくいきます。問題は、デバイス上のコンソールに表示されなくなることです。私が本当に気に入っているのは、stderrストリームをコンソールとファイルの両方にteeする方法です。誰かがそれをどうやって考えているのですか?ファイルとコンソールの両方にiPhoneのstderrを書き込みます。

+0

[NSLog()コンソールとファイルの両方](http://stackoverflow.com/questions/9619708/nslog-to-both-console-and-file) – AechoLiu

答えて

8

別のスレッド(NSLog() to both console and file)で受け入れ可能な回答が見つかりました。その答えをSaileshへ

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

ありがとう:

ソリューションは、デバッガが検出されない場合にのみ、このように、ファイルにリダイレクトすることがあります提供しました。

+0

このif文はどこに書きますか?アプリケーションデリゲートで、または各ビューコントローラにそれを記述する必要がありますか? – Max

+0

stderrをファイルにリダイレクトするコードをカプセル化するには、このif文を記述する必要があります。 –

1

ファイルディスクリプタをfreopen()にすると、そこからデータディスクを読み込んで、データを読んだりすることができます。 thisからのいくつかのアイデアはあなたに役立つでしょう。

標準出力に書き戻すか、/dev/consoleに直接書き込むことができます。 iPhoneで/dev/consoleを開こうとしたことは一度もありませんでしたが、サンドボックスの外にあっても可能です。私は、アプリレビュープロセスがそれをどのように扱うかはわかりません。

1

また、TCPソケットにリダイレクトして、リモートtelnetクライアントで表示することもできます。このようにXCodeの必要はありません!基本的

  1. オブジェクト - C静的メソッドを呼び出し、標準C関数の作成:

     
    void tcpLogg_log(NSString* fmt, ...) 
    { 
        va_list args; 
        va_start(args, fmt); 
        [TCPLogger tcpLog:fmt :args]; 
        va_end(args); 
    } 
    
  2. 静的オブジェクト - C法:

     
    (void)tcpLog:(NSString*)fmt :(va_list)args 
    { 
        NSLogv(fmt, args); 
    
    
    if(sharedSingleton != nil && sharedSingleton.socket != nil) 
    { 
        NSString *time = [sharedSingleton.dateFormat stringFromDate:[NSDate date]]; 
        NSString *msg = [[NSString alloc] initWithFormat:fmt arguments:args]; 
        mach_port_t tid = pthread_mach_thread_np(pthread_self()); 
    
        NSString *str = [NSString stringWithFormat:@"%@[%X]: %@\r\n", time, tid, msg]; 
        NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; 
        [sharedSingleton.socket writeData:data 
              withTimeout:NETWORK_CLIENT_TIMEOUT_PERIOD 
              tag:0];             
    } 
    
    }を
  3. は、その後、あなたの.PCHファイルに、より多くの詳細がTCPソケットを処理するために必要とされている(もちろん)

     
    define NSLog(...) tcpLogg_log(__VA_ARGS__); 
    void tcpLogg_log(NSString* fmt, ...); 
    

のNSLogを上書きするために以下の行を追加します。作業ソースコードは以下のサイトから入手できます。

関連する問題