2009-07-01 1 views
6

Я использую NSLog в своем приложении. И я хотел бы избавиться от раздражающего начала каждой строки: «2009-07-01 21: 11: 06.508 MyApp [1191: 207]».Как избавиться от даты и времени, которое появляется перед каждым оператором NSLog в консоли

Есть ли способ сделать это? Возможно, еще одна функция каротажа?

Спасибо.

ответ

12

Прочитайте это: http://cocoaheads.byu.edu/wiki/different-nslog

Это вики-странице на нашем CocoaHeads сайте, который объясняет, как для создания функции QuietLog, которая делает то, что вы описываете. Он также показывает, как обернуть QuietLog в макрос, называемый LocationLog, чтобы он распечатывал имя файла и номер строки, где у вас есть оператор журнала. Я использую его во всех своих проектах, и я больше не теряю причудливые заявления «NSLog».

+2

+1 Dang, я собирался опубликовать то же самое. Я * написал * эту страницу wiki ... ;-) –

+0

И вы получили ее от Borkware Quickies, так что все это происходит. ;) –

+0

Эта ссылка мертва. – JWWalker

0

Вы можете печатать sdterr:

fprintf(stderr, "%s", "Your message"); 

Edit: Выезд this implementation Карл Крафт

+0

Для этого требуется (преобразование) в строку C, а строка формата с% @ в ней не будет работать. Это неплохая идея, но использование ее напрямую не является заменой NSLog(). –

+0

Верно, вы должны обернуть его в функцию с помощью varargs. Я использую один из Карла Крафта http://www.karlkraft.com/index.php/2009/03/23/114/ –

+0

Мне нравится включить/выключить отладчик в его подходе, но он также не выполняет %% escapes (по общему признанию, редко, но проблематично, когда они происходят). –

1

Мне нравится использовать объектные объекты C для форматирования строк и аргументов, поэтому я переписал NSLog() и добавил его в мои утилиты.


+ (void)myLog:(NSString *)formatString, ... 
{ 
    va_list args; 
    va_start(args, formatString); 
    NSString* output = [[NSString alloc] initWithFormat:formatString arguments:args]; 
    fprintf(stderr, "%s\n", [output UTF8String]); 
    [output release]; 
    va_end(args); 
} 
+0

Если вы прочтете ссылку, на которую ссылается Дэйв, вы увидите, что это то, что мы делаем, за исключением того, что мы также обрабатываем объекты %% в строке формата. –

+0

Куинн, я не видел этого сообщения до тех пор, пока не отправил свой ответ. Также есть кое-что, что можно сказать о том, что ответ был впереди, и не нужно следовать внешней ссылке. – Mark

+0

Не беспокойтесь. (SO обычно скажет вам, когда другие ответы были отправлены ben, но перекрытие вполне нормальное.) Вы правы, иногда приятно иметь код в ответе. Однако, как только он пройдет определенный размер, или в этом случае, когда вики-страница, скорее всего, изменится (что у него есть с поста Dave), лучше всего связать. –

1

Вы попробовали CFShow()?

+0

(Добавлена ​​ссылка на документы) Я не знал об этой функции, ее хорошо знать.Тем не менее, это не замена, потому что вам нужно будет иметь NSString * для включения в CFStringRef. Тем не менее, можно легко определить макрос или функцию для обертывания CFShow() ... –

+0

К сожалению, CFShow имеет очень странное поведение в Leopard, которое оно ошибочно жестко завершает строки нечитабельно. Для Leopard, безусловно, лучше всего избегать CFShow. –

2

Этот макрос препроцессора легко реализовать, и вы не должны изменять любой из ваших текущих NSLog заявлений:

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

Он полностью работает как NSLog без всех дополнительных вещей перед сообщением.

I оригинал нашел это на другом вопросе, но я не могу найти его сейчас.

Смежные вопросы