原始問題: 什麼是iOS應用程序的NSLog的替代日誌記錄模塊?請解釋你親身體驗過的優點和缺點。NSLog替代品?
附加要求1: 我曾嘗試使用TestFlight TFLog這也與日誌上傳到其服務器幫助,但它似乎當你需要時,應用程序在後臺運行的記錄被限制。有助於滾動/壓縮日誌文件和服務器上傳的日誌記錄系統將大有幫助。
附加請求2: 有些人寫的另一個NSLog的問題是Apple提交應用程序生產時不喜歡它。
謝謝。
原始問題: 什麼是iOS應用程序的NSLog的替代日誌記錄模塊?請解釋你親身體驗過的優點和缺點。NSLog替代品?
附加要求1: 我曾嘗試使用TestFlight TFLog這也與日誌上傳到其服務器幫助,但它似乎當你需要時,應用程序在後臺運行的記錄被限制。有助於滾動/壓縮日誌文件和服務器上傳的日誌記錄系統將大有幫助。
附加請求2: 有些人寫的另一個NSLog的問題是Apple提交應用程序生產時不喜歡它。
謝謝。
總是有printf
系列函數,它們通常比NSLog
快,但不支持對象的%@
格式說明符。
最近我一直在使用優秀的Lumberjack框架進行日誌記錄,這是異步的,不會對代碼產生性能影響。它還具有大量用於日誌輸出格式的自定義功能。
你可能已經知道,但你總是可以觀察變量值的XCode調試
檢查時,請出這個 Does Xcode have a watch window?
如果您有興趣製作自己的NSLog變種(完全替換) ,看看here。
如果您不想製作自己的NSLog,但寧願自定義當前的NSLog可以查看一下on this page instead列出的一些技巧。
就我個人而言,我更喜歡redo-NSLog從頭開始的方法,因爲它提供了更多的控制。然而,它需要花費相當多的時間來實現,並且您必須瞭解可變參數列表及其實現以使其正確工作。當你想將va_lists傳遞給不同的函數時,這會變得特別痛苦。製作自己版本的一個便利功能是,您可以設置功能以登錄到任何你喜歡的地方(控制檯或不同的日誌文件) - 這一切都會在一天結束時回到智能fprintf
調用。另一方面,如果你只是想自定義NSLog,那麼你真正需要做的就是熟悉一些方便的編譯器宏(如__LINE__, __PRETTY_FUNCTION__
等)。這是更簡單的方法,可能只是你所追求的一切,但它並不像控制你自己的那樣提供更多的控制。
希望這會有所幫助!
我知道的最好的選擇是宏,你可以使用它與任何預定義的C宏__FILE__
,__PRETTY_FUNCTION__
等。
原型
#define MyLog(args...) MyLogImpl(__FILE__,__PRETTY_FUNCTION__,args);
void MyLogImpl(const char *filename, const char *funcPrettyName, NSString *formatStr, ...);
實施
隨着va_start() va_end()
你就可以得到的格式。爲了彌補printf
缺乏的格式支持,你要使用這個值如下:
NSString *messageStr = [[NSString alloc] initWithFormat:formatStr arguments:replacingArgumentParameters];
,這樣你就能夠與任何其他數據一起打印標準的消息,像
fprintf(stderr, "%s %s", filename, messageStr);
它不僅給你自己的信息,而且文件名稱也叫MYLog。
另一個有用的技巧是限制消息到當前的log_level或正在運行的配置。
如果您覺得自己有足夠的經驗,您還可以繼續嘗試重新定義標準的NSLog宏。
正如「A-Live」所說,最好的選擇是宏。只需在你的.pch文件中定義下面的MACRO即可。
#ifdef DEBUG
#define debug(format, ...) CFShow((__bridge void *)[NSString stringWithFormat:@"%s [LINE: %d] ==>> " format,__PRETTY_FUNCTION__, __LINE__, ## __VA_ARGS__]);
#else
#endif
現在,如何使用上面的宏?
樣品
debug(@"Version Number is 1.0");
注:
您可以通過編輯模式禁用所有調試日誌。 在編輯模式中選擇第一個選項卡,即「信息」
在「信息」選項卡設置構建配置爲「釋放」,然後按「確定」按鈕。
如果你告訴我們你想約的NSLog不同的會是什麼幫助。 – sosborn
Sosborn,我只是添加了一些更多的信息,但我也在跳來聽說我可能還沒有意識到的一些重要功能。謝謝。 – x89a10
我看到,在問題被完全編輯之後,有人通過大多數回答向下投票,而沒有任何評論。聖誕老人,請向該人士發送聖誕禮物,以及編輯批准人。 –