Cómo redirigir la nslog salida a un archivo en lugar de la consola

He cacao aplicación que se ejecuta en OS X. he utilizado NSLog para la depuración propósito. Ahora quiero redirigir el registro de las declaraciones a presentar en lugar de la consola.

He utilizado este método, pero los resultados en el registro de la Consola así como en el archivo.

- (BOOL)redirectNSLog
{
    //Create log file
    [@"" writeToFile:@"/NSLog.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
    id fileHandle = [NSFileHandle fileHandleForWritingAtPath:@"/NSLog.txt"];
    if (!fileHandle)    return NSLog(@"Opening log failed"), NO;
    [fileHandle retain];

    //Redirect stderr
    int err = dup2([fileHandle fileDescriptor], STDERR_FILENO);
    if (!err)   return  NSLog(@"Couldn't redirect stderr"), NO;

    return  YES;
}

Es posible no tener registro de instrucción en la consola, pero sólo en el archivo ??

InformationsquelleAutor Unicorn | 2010-07-06

4 Kommentare

  1. -8

    NSLog está hecha para iniciar sesión en la consola. Necesita definir su propia función MyLog o lo que sea, y reemplazar todas las apariciones de NSLog en MyLog.

    • Hice definir mi función y reemplazar NSLog con mi función definida. Pero todavía tengo que hacer ver los logs en Cosole de la aplicación, así como en el archivo de registro que he creado. Me gustó la idea de la definición propia de la función para el registro.
    • Confirme que el archivo de creación trabajado. He probado este código y funciona. Los enlaces de código escribe el archivo en la raíz de que he cambiado a mi directorio home.
  2. 66

    Paso 1: Incluir la siguiente función en el AppDelegate:

     - (void) redirectConsoleLogToDocumentFolder
     {
           NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                         NSUserDomainMask, YES);
           NSString *documentsDirectory = [paths objectAtIndex:0];
           NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"];
           freopen([logPath fileSystemRepresentation],"a+",stderr);
     }

    Paso 2: Llamar a esta función en el inicio de la función applicationDidFinishLaunchingWithoptions…

    Eso es todo, Cada NSLog() ahora redirecciona a esta consola.archivo de registro, que se puede encontrar en el directorio de documentos.

    • Definitivamente una respuesta mejor que la mía:) Cambió cStringWithEncoding:NSASCII... a fileSystemRepresentation. La gente puede tener letras no ASCII en el camino (lo cual es raro en ~/Documents/)
    • Maravilloso! También funciona para las aplicaciones iOS. Usted encontrará la consola.registro dentro de un directorio como este: /Users/Fernando/Library/Application Support/iPhone Simulator/6.1/Applications/18FB521C-A782-44E4-9DFA-B963FD7DC44B/Documents/console.log Gracias! 🙂
    • Cerrar o dejar de escribir la salida en la consola de uso fflush(fileP); fclose(fileP); Para obtener puntero de archivo, utilice FILE *fileP = freopen([logPath.. en el método anterior y mantener este puntero alrededor. De esta manera usted puede envolver alrededor de caudal específico/nslog las llamadas a este archivo de salida.
    • También, si usted no ve toda la salida (falta una parte) puede agregar una función void flush_std_err() { fflush(stderr); } y el gancho de at_exit en algún lugar en las principales at_exit(flush_std_err)
    • Podría explicar por qué la corriente es de stderr
    • ¿por qué utilizar stderr en lugar de la salida estándar (stdout) en freopen?

  3. 12

    Recientemente me he enfrentado requisito similar y esto es cómo lo he hecho.

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        //Override point for customization after application launch.
    
        [self redirectConsoleLogToDocumentFolder];
    
    
        return YES;
    }
    
    - (void) redirectConsoleLogToDocumentFolder
    {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                             NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.txt"];
        freopen([logPath fileSystemRepresentation],"a+",stderr);
    } 

    Y Ahora, si quieres para esta consola de usuario

    -(void)displayLog{
    
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths firstObject];
        NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.txt"];
    
        NSError *err = nil;
        NSString *fileContents = [NSString stringWithContentsOfFile:logPath
                                                           encoding:NSUTF8StringEncoding
                                                              error:&err];
        if (fileContents == nil) {
            NSLog(@"Error reading %@: %@", logPath, err);
        } else {
            self.textView.text = fileContents;
        }
    
    }
    • justo lo que necesitaba para un rápido ataque de depuración 🙂
    • Usted puede utilizar tail –f console.log tiempo de ejecución ver el registro o uso tail –f console.log | grep “xxx”
  4. 3

    Usted puede estar interesado en CocoaLumberjack. Es un sistema muy flexible de registro de marco para Mac OS X y iOS. Un registro de instrucción puede ser enviado, no sólo para la consola, pero a un archivo de forma simultánea. Además de que es más rápido, a continuación, NSLog. Yo lo uso en un proyecto que tiene el código común para OS X y iOS.

    • Gracias dbainbridge. Estoy utilizando el mismo marco para mis aplicaciones.
    • ¿CocoaLumberjack redirigir NSLog? He buscado es el código de la base de que no existe ningún signo de freopen.Yo creo que no.
    • Sería mejor reemplazar su NSLogs con la adecuada DDLog* * * declaraciones con CocoaLumberjack. CocoaLumberjack también utiliza MCD así es mucho más rápido, a continuación, simplemente reemplazando NSLog con un método diferente.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea