cocoa - script - Cómo redirigir la salida nslog al archivo en lugar de la consola
tuberias y filtros en linux (4)
Tengo la aplicación Cocoa ejecutándose en OS X. He utilizado NSLog para fines de depuración. Ahora quiero redirigir las instrucciones de registro al archivo en lugar de a la consola.
He usado este método pero resulta en iniciar sesión en la consola y 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 la declaración de registro en la consola pero solo en el archivo?
NSLog
está hecho para iniciar sesión en la consola. Necesita definir su propia función MyLog
o lo que sea, y reemplazar todas las NSLog
de NSLog
en MyLog
.
Paso 1: incluye la siguiente función en 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: Llame a esta función al inicio de la aplicación applicationDidFinishLaunchingWithOptions ...
Eso es todo, cada NSLog () ahora será redireccionado a este archivo console.log, que puede encontrar en el directorio de documentos.
Usted puede estar interesado en CocoaLumberjack . Es un marco de registro muy flexible tanto para Mac OS X como para iOS. Una declaración de registro puede enviarse no solo a la consola sino a un archivo simultáneamente. Además, es más rápido que NSLog. Lo uso en un proyecto que tiene un código común para OS X e iOS.
Recientemente me he enfrentado a un requisito similar y así es como lo hice.
- (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 esta consola para el 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;
}
}