2012-03-08 53 views
23

我想將NSog()重定向到文件,但仍然在控制檯中看到輸出。 我知道stderr可以使用重定向到文件:NSLog()到控制檯和文件

freopen("file.log", "a+", stderr); 

但重定向到文件後,該日誌沒有更多的控制檯輸出顯示。

我可以圍繞NSLog()建立一個自定義的包裝,但是我不會在應用崩潰時獲得寫入stderr的日誌崩潰日誌。

我也在嘗試使用dup()和其他複製文件描述符的方法,但輸出在文件或控制檯中是ether,從來都沒有。

這裏提出了類似的問題: Write stderr on iPhone to both file and console 但沒有接受答案,或者建議使用NSLog()包裝器。

有沒有人有關如何管理這項工作的想法? Thanx提前。

UPDATE:重定向的最重要的部分是有寫入到控制檯和文件系統錯誤日誌(標準錯誤)。

+0

如果你做兩個單獨的日誌,發送一個文件,一個控制檯,但保持相同? – JTApps 2012-03-08 15:05:41

+0

你如何建議管理這個?最重要的是將系統錯誤日誌寫入控制檯和文件。 – 2012-03-08 15:11:41

+2

'NSLog'默認情況下登錄到控制檯,也許你可以從那裏提取你的日誌http://stackoverflow.com/questions/7150849/how-can-i-get-a-console-readout-at-runtime-in -an-application/7151773#7151773 – Joe 2012-03-08 15:15:54

回答

8

According to the docs,您將需要一個自定義日誌工具。

您需要在最低程度,採用可變參數和printd到的NSLog和fprintf,類似的功能:

void myLog(NSString* format, ...) 
{ 
    va_list argList; 
    va_start(argList, format); 
    NSString* formattedMessage = [[NSString alloc] initWithFormat: format arguments: argList]; 
    va_end(argList); 
    NSLog(@"%@", formattedMessage); 
    fprintf(myFileDescriptor, "%s\n", [formattedMessage UTF8String]); 
    [formattedMessage release]; // if not on ARC 
} 

或者有可可日誌框架。

Looking for a Specific Cocoa Logging Framework

+0

謝謝,這很好,但檢查我更新的問題。我正在尋找一些方法來獲取系統的stderr日誌到控制檯和文件,不僅我的自定義日誌。謝謝。 – 2012-03-08 16:06:57

+0

@Miroslav:我不認爲如果沒有類似的改變,我沒有給你。 – JeremyP 2012-03-09 13:51:42

25

我們已經實現的方式是:

if (!isatty(STDERR_FILENO)) { 
    // Redirection code 
} 

這是基於一般的假設,如果一個主機連接,你不需要那些日誌存儲在文件中,因爲你是已經在調試。所以無論何時連接控制檯,日誌都會打印在那裏,否則保存到文件中。

+0

太棒了!這正是我需要的!謝謝Sailesh。 – 2012-10-17 01:44:36