2010-01-20 14 views
7

que estoy usando:iPhone: una vez que he redirigido NSLog a un archivo, ¿cómo puedo revertirlo a la consola?

#if TARGET_IPHONE_SIMULATOR == 0 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"]; 
    freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr); 
#endif 

.. para redirigir NSLog a un archivo, que funciona muy bien por cierto.

Quiero hacer que el registro archive algo que el usuario de mi aplicación puede activar y desactivar ... ¿alguien sabe cómo redirigir NSLog/stderr a la consola?

Gracias!

Respuesta

4

Esto no responde explícitamente a su pregunta, pero si todo lo que necesita para redirigir es la salida de NSLog, entonces consideraría usar un contenedor alrededor de NSLog() y decidir si enviarlo a un archivo oa NSLog/stderr normal en una bandera que mantiene alrededor que el usuario puede controlar.

(Se siente como un diseño sorprendente para mí fundamentalmente redirigir la corriente stderr para lograr esto-- y con un envoltorio por encima del nivel NSLog, podría elegir fácilmente enviar la salida a ambos lugares si alguna vez quería .)

+0

Segundo eso! ¡No redirigir el stderr indiscriminadamente! –

+0

bien lo tengo. Gracias chicos. –

+1

Existen razones válidas para redirigir todas las llamadas NSLog a un archivo, por ejemplo, si necesita capturar registros generados por bibliotecas de terceros que usan NSLog internamente. – irodrigo17

15

Esto está tomado de http://www.atomicbird.com/blog/2007/07/code-quickie-redirect-nslog

// Save stderr so it can be restored. 
int stderrSave = dup(STDERR_FILENO); 

// Send stderr to our file 
FILE *newStderr = freopen("/tmp/redirect.log", "a", stderr); 

NSLog(@"This goes to the file"); 

// Flush before restoring stderr 
fflush(stderr); 

// Now restore stderr, so new output goes to console. 
dup2(stderrSave, STDERR_FILENO); 
close(stderrSave); 

// This NSLog will go to the console. 
NSLog(@"This goes to the console"); 
Cuestiones relacionadas