Ответ 1
NSLog
выполняется для входа в консоль. Вам нужно определить свою собственную функцию MyLog
или что угодно, и заменить все вхождения NSLog
на MyLog
.
У меня есть приложение cocoa, работающее в OS X. Я использовал NSLog для цели отладки. Теперь я хочу перенаправить операторы журнала в файл вместо консоли.
Я использовал этот метод, но он приводит к регистрации в консоли, а также в файле.
- (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;
}
Возможно ли иметь оператор журнала в консоли, но только в файле?
NSLog
выполняется для входа в консоль. Вам нужно определить свою собственную функцию MyLog
или что угодно, и заменить все вхождения NSLog
на MyLog
.
Шаг 1: Включите следующую функцию в 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);
}
Шаг 2: вызов этой функции в начале функции applicationDidFinishLaunchingWithOptions...
Это означает, что каждый NSLog() теперь перенаправляется на этот файл console.log, который вы можете найти в каталоге документов.
Недавно я столкнулся с аналогичным требованием, и именно так я это сделал.
- (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);
}
И теперь, если вы хотите эту консоль для пользователя
-(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;
}
}
Вам может быть интересно CocoaLumberjack. Это очень гибкая структура ведения журналов для Mac OS X и iOS. Один оператор регистрации может быть отправлен не только на консоль, но и на файл одновременно. Плюс это на самом деле быстрее, чем NSLog. Я использую его в проекте с общим кодом для OS X и iOS.