2011-09-28 15 views
9

Estoy siguiendo la sugerencia en la respuesta here para redirigir la salida NSLog en un dispositivo iOS a un archivo, que funciona muy bien. El problema es que ya no aparece en la consola del dispositivo. Lo que realmente me gustaría es una forma de emitir el flujo stderr a la consola y al archivo. ¿Alguien tiene una idea de cómo hacer eso?Escribir stderr en el iPhone en el archivo y la consola

+0

posible duplicado de [NSLog() a consola y archivo] (http://stackoverflow.com/questions/9619708/nslog-to-both-console-and-file) – AechoLiu

Respuesta

8

Encontré una respuesta aceptable en otro hilo (NSLog() to both console and file).

La solución siempre que es única para redirigir a un archivo si no se detecta un depurador, como esto:

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

Gracias a Sailesh para esa respuesta.

+0

¿dónde deberíamos escribir esta declaración if? ¿En el delegado de la aplicación o tenemos que escribirlo en todos y cada uno de los controladores de vista? – Max

+0

Debe escribir esta instrucción if para encapsular el código que redirige stderr a un archivo. –

1

Una vez que freopen() el descriptor de archivo, puede leer y hacer lo que desee con los datos. Algunas ideas del this le serán útiles.

Puede escribirlo en stdout o intentar escribir directamente en /dev/console. Nunca intenté abrir /dev/console en un iPhone, pero supongo que es posible a pesar de estar fuera de la caja de arena. No estoy seguro de cómo lo tratará el proceso de revisión de la aplicación.

1

O puede redirigir a un socket TCP y ver en un cliente de telnet remoto. No hay necesidad de XCode de esta manera!

Básicamente:

  1. Crear una función estándar de C, que llama a un método estático Obj-C:

     
    void tcpLogg_log(NSString* fmt, ...) 
    { 
        va_list args; 
        va_start(args, fmt); 
        [TCPLogger tcpLog:fmt :args]; 
        va_end(args); 
    } 
    
  2. El método Obj-C estática:

     
    (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. A continuación, en el archivo de .pch, agregue las siguientes líneas para anular NSLog()

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

Por supuesto se requieren más detalles para manejar el socket TCP. El código fuente de trabajo está disponible aquí: https://github.com/driedler/iOS-TCP-Logger/wiki/About

Cuestiones relacionadas