Nano Hash - криптовалюты, майнинг, программирование

Как перенаправить вывод nslog в файл вместо консоли

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

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

06.07.2010

Ответы:


1

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

06.07.2010
  • Я определил свою функцию и заменил NSLog моей определенной функцией. Но все же я вижу журналы в приложении Cosole, а также в файле журнала, который я создал. Мне понравилась идея определить собственную функцию для логирования. 14.03.2011
  • Подтвердите, что создание файла сработало. Я протестировал этот код, и он работает. Связанный код записывает файл в корень, который я изменил в свой локальный домашний каталог. 12.08.2016

  • 2

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

    09.05.2011
  • Определенно лучший ответ, чем мой :) Изменил cStringWithEncoding:NSASCII... на fileSystemRepresentation. В пути могут быть буквы, отличные от ASCII (что маловероятно для ~/Documents/) 09.05.2011
  • Чудесно! Это также работает для приложений iOS. Вы найдете файл console.log в такой папке: /Users/Fernando/Library/Application Support/iPhone Simulator/6.1/Applications/18FB521C-A782-44E4-9DFA-B963FD7DC44B/Documents/console.log Спасибо! :-) 25.03.2013
  • Чтобы закрыть/остановить запись вывода в консоли - используйте fflush(fileP); fclose(fileP); Чтобы получить указатель на файл, используйте FILE *fileP = freopen([logPath.. в методе выше и держите этот указатель рядом. Таким образом, вы можете обернуть определенные вызовы потока/nslog в этот выходной файл. 14.11.2013
  • Кроме того, если вы не видите весь вывод (некоторая часть отсутствует), вы можете добавить функцию void flush_std_err() { fflush(stderr); } и подключиться к at_exit где-нибудь в главном at_exit(flush_std_err) 14.10.2015
  • Не могли бы вы объяснить, почему поток из stderr 20.09.2016
  • зачем использовать stderr вместо stdout во freopen? 20.09.2016

  • 3

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

    - (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;
        }
    
    }
    
    24.12.2014
  • как раз то, что мне нужно для быстрой отладки :-) 09.09.2015
  • Вы можете использовать tail –f console.log среду выполнения, см. журнал, или использовать tail –f console.log | grep “xxx” 20.07.2016

  • 4

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

    21.01.2012
  • Спасибо dbainbridge. Я использую ту же структуру для своих приложений. 14.02.2012
  • CocoaLumberjack перенаправляет NSLog? Я искал в его кодовой базе никаких признаков freopen. Думаю, нет. 30.04.2014
  • Было бы лучше заменить ваши NSLogs соответствующими операторами DDLog * с помощью CocoaLumberjack. CocoaLumberjack также использует GCD, поэтому это намного быстрее, чем простая замена NSLog другим методом. 02.05.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..