2012-03-08 14 views
23

Chciałbym przekierować NSog() do pliku, ale nadal, aby zobaczyć wyjście w konsoli. Jestem świadomy, że stderr może zostać przekierowany do pliku przy użyciu:NSLog() do konsoli i pliku

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

ale po skierowanie go do pliku dziennika nie jest już pokazany na wyjściu konsoli.

Mogłem zbudować niestandardową owijkę wokół NSLog(), ale nie dostałbym zarejestrowanych dzienników awarii, które są zapisywane do stderr w momencie awarii aplikacji.

Eksperymentowałem również z dup() i innymi metodami powielania deskryptorów plików, ale wynik był eterem w pliku lub w konsoli, nigdy w obu.

Podobne pytania zadawano tutaj: Write stderr on iPhone to both file and console ale bez akceptowanej odpowiedzi lub z sugestią użycia opakowania NSLog().

Czy ktoś ma pomysł, jak zarządzać tą pracą? Thanx z góry.

UPDATE: Najważniejszą częścią przekierowania jest mieć logi błędów systemowych (stderr) pisemne zarówno konsoli i pliku.

+0

Co zrobić, jeśli wykonasz dwa oddzielne logi, wyślesz jeden do pliku, a drugi do konsoli, ale zachowasz je tak samo? – JTApps

+0

Jak sugerujesz radzić sobie z tym? Najważniejsze jest, aby logi błędów systemu były zapisywane zarówno na konsoli, jak i na pliku. –

+2

'NSLog' domyślnie loguje się do konsoli, może mógłbyś po prostu wyciągnąć logi z tego miejsca http://stackoverflow.com/questions/7150849/how-can-i-get-a-console-readout-at-runtime-in -an-application/7151773 # 7151773 – Joe

Odpowiedz

8

According to the docs, będziesz potrzebować niestandardowego narzędzia dziennika.

Trzeba co najmniej, funkcja, która trwa zmiennej liczbie argumentów argumentów i printd do NSLog i fprintf, coś jak:

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 
} 

Albo istnieją kakao ramy rejestrowania.

Looking for a Specific Cocoa Logging Framework

+0

Dzięki, to jest dobre, ale sprawdź moje zaktualizowane pytanie. Szukam sposobu, aby uzyskać logi systemowe stderr zarówno do konsoli i pliku, nie tylko moje niestandardowe dzienniki. Dzięki. –

+0

@Miroslav: Nie sądzę, że to możliwe bez podobnej zmiany w stosunku do tego, co ci dałem. – JeremyP

25

Sposób wdrożyliśmy jest:

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

ta opiera się na ogólnym założeniu, że jeśli jest podłączona konsola, nie trzeba przechowywać te logi w pliku ponieważ jesteś już debugowanie. Tak więc, gdy konsola jest dołączona, logi będą drukowane tam, w przeciwnym razie zapisywane do pliku.

+0

Awesome! Właśnie tego potrzebowałem! Dzięki, Sailesh. –

Powiązane problemy