Как перенаправить вывод nslog в файл вместо консоли - PullRequest
17 голосов
/ 06 июля 2010

У меня есть приложение какао, работающее на 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;
}

Возможно ли, чтобы в консоли не было оператора журнала, а только в файле ??

Ответы [ 4 ]

65 голосов
/ 09 мая 2011

Шаг 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, который вы можете найти в каталоге документов.

12 голосов
/ 24 декабря 2014

Недавно я столкнулся с аналогичным требованием, и вот как я это сделал.

- (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;
    }

}
3 голосов
/ 22 января 2012

Вас может заинтересовать CocoaLumberjack . Это очень гибкая среда ведения журналов для Mac OS X и iOS. Один оператор записи может быть отправлен не только на консоль, но и в файл одновременно. Плюс это на самом деле быстрее, чем NSLog. Я использую его в проекте, который имеет общий код для OS X и iOS.

0 голосов
/ 06 июля 2010

NSLog сделано для входа в консоль.Вам нужно определить свою собственную функцию MyLog или что-то еще и заменить все вхождения NSLog на MyLog

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...