В XCode, есть ли способ отключить метки времени, которые появляются в консоли отладчика при вызове NSLog? - PullRequest
26 голосов
/ 30 августа 2009

Консоль отладчика XCode позволяет легко видеть любые сообщения отладки, которые мое приложение отправляет, используя NSLog(), но всегда прикрепляет к ним префикс временной метки:

2009-08-30 04:54:48.128 MyApp[94652:a0f] some log message
2009-08-30 04:54:50.647 MyApp[94652:a0f] another log message
...

Мне не нужен этот префикс, и он занимает много места. У меня такое чувство, что оно жестко запрограммировано в системе регистрации Apple, но на всякий случай есть решение:

Можно ли в консоли отладчика показывать мне сообщения журнала без префикса метки времени?

Что-то вроде этого было бы идеально:

some log message
another log message
...

Ответы [ 8 ]

24 голосов
/ 30 августа 2009

NSLog () - это то, что делает это, а не консоль отладчика.

Самый простой способ избежать этого - вообще не использовать NSLog. Вы можете использовать fprintf (), но это неприятно, так как он не поддерживает типы форматов% @.

Я обычно пишу функцию для этого:

void MyLog(NSString *format, ...) {
    va_list args;
    va_start(args, format);
    NSString *formattedString = [[NSString alloc] initWithFormat: format
                                                  arguments: args];
    va_end(args);
    [[NSFileHandle fileHandleWithStandardOutput]
        writeData: [formattedString dataUsingEncoding: NSNEXTSTEPStringEncoding];
    [formattedString release];
}

Очевидно, измените его для добавления новой строки или используйте более короткий префикс и т. Д. *

(исправлено отклонение ctrl-b)

11 голосов
/ 21 марта 2014

Определить макрос

#if __has_feature(objc_arc)
  #define MDLog(format, ...) CFShow((__bridge CFStringRef)[NSString stringWithFormat:format, ## __VA_ARGS__]);
#else
  #define MDLog(format, ...) CFShow([NSString stringWithFormat:format, ## __VA_ARGS__]);
#endif

И используйте этот макрос в вашем коде, как

NSLog(@"some log message");
MDLog(@"some log message");

Вот вывод консоли

NSLog -> 2014-01-28 10:43:17.873 TestApp[452:60b] some log message
MDLog -> some log message


приписка

Если кому-то нужны пользовательские журналы, которые дают вам больше информации, например, имя метода / номер строки и т. Д., Можете загрузить открытый исходный код MLog.h on GitHub.

9 голосов
/ 12 августа 2013

вставьте этот однострочный код в ваш файл .pch, и все готово

#define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);

обратите внимание на ## часть

6 голосов
/ 21 апреля 2011

Чтобы продолжать использовать NSLog в сочетании с ответом bbum, используйте макрос препроцессора для переопределения NSLog для вашей собственной функции

#define USECUSTOMLOGS 1
#ifdef USECUSTOMLOGS
#define NSLog MyLog
#endif

Это заменит NSLog на MyLog во время компиляции. По сути, вы можете продолжать использовать NSLog везде, и он все равно будет использовать ваш собственный формат для окна консоли. Вы также можете изменить его обратно, чтобы использовать NSLog в любое время, изменив 1 на 0.

4 голосов
/ 14 декабря 2012

ARC Версия:

void NFLog(NSString *format, ...)
{
    va_list args;
    va_start(args, format);
    NSString *formattedString = [NSString stringWithFormat:format, args];
    formattedString = [formattedString stringByAppendingString:@"\n"];
    va_end(args);
    [[NSFileHandle fileHandleWithStandardOutput] writeData: [formattedString dataUsingEncoding: NSUTF8StringEncoding]];
}

Обновление:

Что я делаю, так это добавляю этот код в xxx-Prefix.pch, тогда вы можете использовать его где угодно:

#define newLine         do { [(NSFileHandle*)[NSFileHandle fileHandleWithStandardOutput] writeData:[@"\n" dataUsingEncoding: NSUTF8StringEncoding]]; } while(0);
#define NFLog(args,...) do { [(NSFileHandle*)[NSFileHandle fileHandleWithStandardOutput] writeData:[[NSString stringWithFormat:args, ##__VA_ARGS__] dataUsingEncoding: NSUTF8StringEncoding]]; } while(0); newLine

и если вы хотите вернуть NSLog:

#define NFLog(args,...) NSLog(args,##__VA_ARGS__)
1 голос
/ 28 июля 2018

Макрос чистого журнала

Вот макрос, который я сделал для этой цели. Он работает точно так же, как NSLog, но только с вашим текстом, без дополнительной информации


Макрос (вставьте в свой .h)

#define CLog(__string, ...) fprintf(stderr, "\n%s", [([NSString stringWithFormat:__string, ##__VA_ARGS__]) UTF8String])

Пример использования:

CLog(@"I am %i days and %i years old", 3, 7);

Журналы:

I am 3 days and 7 years old

1 голос
/ 20 августа 2015

Это намного проще, чем предлагаемые решения. Воспользовавшись решением carelesslyChoosy и добавив немного больше, чтобы он регистрировал записи в сборках релизов, вы получите только макрос, приведенный ниже. Просто добавьте этот макрос в ваш заголовок или файл .pch. Этот макрос будет показывать записи журнала, когда флаг DEBUG включен, при сборках выпуска вы не увидите записи журнала.

#ifdef DEBUG
#define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#define Log(x, ...) NSLog(@"%s %d: " x, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#else
#define Log(x, ...)
#endif
1 голос
/ 11 августа 2012

В верхнем левом углу окна консоли есть выпадающее меню с надписью «Все выходные данные / выходные данные отладчика / выходные данные».

Выберите целевой выход. Он работал на моих старых версиях XCode, но, честно говоря, не работает с моей текущей версией 4.3.

Надеюсь, это вам поможет.

JR

...