2012-03-08 24 views
23

Dosyaya NSog() yeniden yönlendirmek istiyorum, ancak yine de konsolu çıktı olarak görmek istiyorum. Ben stderr kullanarak dosyaya yönlendirilebilir farkındayım:NSLog() hem konsol hem de dosyaya

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

ama bunu dosyaya yönlendirmek sonra, günlük artık konsol çıktısı gösterilmektedir.

NSLog() etrafında özel bir sarmalayıcı oluşturabilirim ancak uygulama çökmesi sırasında stderr'a yazılan kilitlenme günlüklerini kaydetmem.

Ayrıca dup() ile deneme ve dosya tanıtıcılarını çoğaltma için diğer yöntemler, ancak çıktı dosya veya konsolda ether oldu, her ikisi de. Write stderr on iPhone to both file and console ancak kabul edilen yanıt vermeden ya da bir NSLog() sarmalayıcı kullanmak için öneri:

Benzer sorular burada istendi.

Bu çalışmayı nasıl yöneteceğiniz konusunda bir fikri olan var mı? Thanx önceden.

GÜNCELLEME: yönlendirme en önemli parçası konsolu ve dosyaya hem yazılı sistem hata günlüklerini (Stderr) sahip olmaktır.

+0

İki ayrı günlük oluşturursanız, bir dosyaya ve bir tanesine gönderin, ancak bunları aynı tutun; – JTApps

+0

Bunu nasıl yönetmenizi önerirsiniz? En önemli şey, sistem hata kayıtlarının hem konsol hem de dosyaya yazılmasıdır. –

+2

'NSLog' varsayılan olarak konsola giriş yapar, belki de günlüklerinizi buradan çıkartabilirsiniz http://stackoverflow.com/questions/7150849/how-can-i-get-a-console-readout-at-runtime-in -an-application/7151773 # 7151773 – Joe

cevap

8

According to the docs, özel bir günlük özelliğine ihtiyacınız olacaktır.

Sen en azından ihtiyaç NSLog ve fprintf, böyle bir şey için variadic argümanlar ve printd alan bir fonksiyon:

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 
} 

Veya Kakao günlüğü çerçeveler vardır.

Looking for a Specific Cocoa Logging Framework

+0

kullanımının olduğunu varsaydım, teşekkürler, ama güncellenmiş sorumu kontrol et. Sistemin stderr günlüklerini hem konsol hem de dosyaya, sadece özel günlüklerime getirmenin bir yolunu arıyorum. Teşekkürler. –

+0

@Miroslav: Size verdiğim şeye benzer bir değişiklik olmadan bunun mümkün olduğunu düşünmüyorum. – JeremyP

25

biz hayata geçirdik yoludur:

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

Bu bir konsol bağlıysa, size olduğundan dosyada bu günlükleri saklamak gerekmez genel varsayımına dayanmaktadır zaten hata ayıklama. Konsol eklendiğinde, orada günlükler yazdırılacak, aksi takdirde bir dosyaya kaydedilecek.

+0

Harika! Bu tam olarak ihtiyacım olan şey! Teşekkürler Sailesh. –

İlgili konular