2011-04-15 118 views
1

默認的NSLog輸出請求的輸出前的長字符串,自定義的NSLog所以它顯示出較低的信息

如:

NSLog(@"Log message"); 

輸出到控制檯:

2011-04-15 11:23:01.692 MyAppName[23160:903] Log message 

我知道我可以將文件名和行號添加到日誌中,但是如何擺脫出現在消息之前的所有日期,時間和應用程序名稱?

我發現它確實讓Xcode中的控制檯變得更加混亂,這使得它很難找到我之後的信息。

+1

可能重複的[是否有可能的NSLog(),而不時間和日期戳,和自動換行?](HTTP:// stackoverflow.com/questions/3487226/is-it-possible-to-nslog-without-the-time-and-date-stamps-and-the-automatic-new) – 2011-04-15 07:43:37

回答

2

這絕對是我在新項目上做的第一件事。 NSLog(…)已有腹瀉。這裏是一個基本的宏,可以讓你得到一些和平和安靜 ..和日誌基本對象沒有惱人的NSLog(@"%@", xYz);語法(而不是你只是NSLog(xYz);)。

#define NSLog(fmt...) NSShutUp(__PRETTY_FUNCTION__,fmt) 
#define UTF8FMT(fmt,argL) \ 
     [NSString.alloc initWithFormat:fmt arguments:argL].UTF8String 

void NSShutUp(const char*func, id fmt, ...) { 
    if (![fmt isKindOfClass:NSString.class]) 
    // it's not a string (aka. the formatter), so print it) 
     fprintf (stderr, "%s: %s\n", func, 
     [[NSString stringWithFormat:@"%@",fmt,nil]UTF8String]); 
    else {  va_list argList;  va_start (argList, fmt); 
     fprintf (stderr, "%s: %s\n", func, UTF8FMT(fmt,argList)); 
     va_end (argList); 
} } 

/* SAMPLE RUN */ 

int main (void) { NSString *a; NSNumber *b; NSArray *c; 
    NSLog(a = @"Ahh, silence." ); 
    NSLog(b = @(M_PI)   ); 
    NSLog(c = @[@"Arrays, baby!"]); 
    // Old syntax still works. 
    NSLog(@"%@ * %@ * %@",a,b,c); 
    return 0; 

}

OUTPUT

int main(): Ahh, silence. 
int main(): 3.141592653589793 
int main(): (
    "Arrays, baby!" 
) 
int main(): Ahh, silence. * 3.141592653589793 * (
    "Arrays, baby!" 
) 
+0

我強烈建議給你的自定義日誌記錄宏不同的名字。重新定義NSLog將會讓人們在將來閱讀你的代碼時感到困惑。 – bdash 2013-04-13 21:08:28

+0

@alex,似乎你還沒有理解爲什麼在NSLog中使用格式字符串是絕對必要的。我建議閱讀一些關於應用程序安全性的文章,用戶提供的或錯誤的日誌數據如何使應用程序崩潰或泄漏明智的信息,更不用說通過堆棧溢出代碼注入等。如果您不關心應用程序中的所有內容,那麼忽略其他基本應用程序設計規則可能沒關係。 – 2013-04-14 08:44:27