2012-03-08 12 views
23

Me gustaría redirigir NSog() al archivo, pero todavía para ver la salida en la consola. Soy consciente de que stderr puede ser redirigido a presentar usando:NSLog() a consola y archivo

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

pero después de volver a enviarlos presentar, el registro es no más se muestra en la salida de la consola.

Pude crear un contenedor personalizado alrededor de NSLog() pero no obtuve registros de bloqueo registrados en stderr en el momento de la falla de la aplicación.

También estaba experimentando con dup() y otros métodos para duplicar descriptores de archivos, pero el resultado fue éter en el archivo o en la consola, nunca en ambos. Se pidió

preguntas similares aquí: Write stderr on iPhone to both file and console pero sin respuesta aceptada, o con la sugerencia de utilizar un envoltorio NSLog().

¿Alguien tiene una idea sobre cómo administrar este trabajo? Gracias por adelantado.

ACTUALIZACIÓN: La parte más importante de redireccionamiento es tener registros de error del sistema (stderr) escritas en consola y archivo.

+0

¿Qué sucede si hace dos registros separados, envía uno al archivo y uno a la consola, pero los mantiene igual? – JTApps

+0

¿Cómo sugieres administrar esto? Lo más importante es tener registros de errores del sistema escritos tanto en la consola como en el archivo. –

+2

'NSLog' se registra de forma predeterminada en la consola, tal vez podrías extraer tus registros desde allí http://stackoverflow.com/questions/7150849/how-can-i-get-a-console-readout-at-runtime-in -an-application/7151773 # 7151773 – Joe

Respuesta

8

According to the docs, necesitará una instalación de registro personalizada.

Es necesario, como mínimo, una función que toma argumentos variadic y printd a NSLog y fprintf, algo así como:

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 
} 

O existen marcos de registro de cacao.

Looking for a Specific Cocoa Logging Framework

+0

Gracias, esto es bueno, pero revisa mi pregunta actualizada. Estoy buscando alguna manera de obtener los registros stderr del sistema tanto para la consola como para el archivo, no solo mis registros personalizados. Gracias. –

+0

@Miroslav: No creo que eso sea posible sin un cambio similar a lo que te he dado. – JeremyP

25

La forma en que hemos implementado es:

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

Esto se basa en la asunción general de que si una consola se fija, no es necesario para almacenar los registros en el archivo ya que eres ya está depurando Por lo tanto, cada vez que se conecta la consola, los registros se imprimirán allí, de lo contrario se guardarán en un archivo.

+0

¡Impresionante! Esto es exactamente lo que necesitaba! Gracias Sailesh. –

Cuestiones relacionadas