2012-07-05 58 views
2

我想重定向所有NSLog輸出,以便能夠在應用程序內部的UITextView中查看我所有的日誌(用於調試目的,也許以後會使用TestFlight記錄所有內容)。我不能使用衆所周知的DLog,因爲我想從我不擁有的框架中捕獲日誌。在設備上忽略NSLog

我正在通過將'stderr'重定向到管道並從此管道中讀取來完成此操作。 無論如何,當應用程序從Xcode中啓動時,這在模擬器和設備上運行良好。 但是,當應用程序在設備上「手動」啓動時,這不起作用。

看來,NSLog調用對設備沒有影響:我沒有從管道讀取任何東西。但是,如果我手動寫入stderr:fprintf(stderr, "test")我可以從管道讀取它,所以問題不在於stderr,而是在NSLog函數中。

爲什麼它在設備上什麼都不做?有沒有辦法讓它寫在stderr上甚至在設備上?

如果無法在設備上使用NSLog,還有另一種從外部框架收集日誌的方法嗎?

謝謝。

+0

我的印象是,除非它通過一個調試運行的NSLog輸出不被處理。很明顯,手動啓動應用程序時沒有調試器,但在模擬器中啓動應用程序。在生產環境中,即在設備上運行時,NSLog佔用的代碼行被有效地忽略。 – 2012-07-05 15:35:33

+0

您可以通過使用Organizer查看設備來訪問NSLog輸出。 – 2012-07-05 15:41:31

+0

謝謝@DanielHanly。我希望有一種方法可以讓設備認爲它在「調試環境」中運行。我該如何記錄TestFlight上發生的事情呢?熱舔:嗯,我想要某種實時日誌記錄,並且我還需要將日誌發送到TestFlight。 – user1504454 2012-07-05 15:47:05

回答

3

NSLog進入系統登錄設備。您可以使用C API asl (Apple System Log)訪問系統日誌;還檢查出this blog post

但是,如果您使用的是TestFlight,那麼使用TFLog語句替換/追加這些NSLog語句就容易多了。

TFLog(@"This comment is live on TestFlight."); 
+0

這就是我想要的。感謝您的鏈接。 – user1504454 2012-07-06 08:03:56

0

如果你想要一些UILogging,你可以考慮使用ULOG,一個UIAlertView中基於記錄#define指令。

// ULog will show the UIAlertView only when the DEBUG variable is set 

#ifdef DEBUG 
# define ULog(fmt, ...) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"%s\n [Line %d] ", __PRETTY_FUNCTION__, __LINE__] message:[NSString stringWithFormat:fmt, ##__VA_ARGS__] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alert show]; } 
#else 
# define ULog(...) 
#endif 

(來源:http://overbythere.co.uk/blog/2012/01/alternatives-nslog

相關問題