2012-10-16 16 views
7

Tüm mesajları Objective-C tasarımında günlüğe kaydetmek için bu CocoaLumberjack çerçevesini kullanıyorum. Şimdi tüm hataları bir dosyaya ve diğer tüm mesajlara başka bir dosyaya kaydetmek istiyorum. Bu bilgiyi filtrelemek için formatlayıcı kullanabileceğimi biliyorum. AppDelegate'de iki adet DDFileLogger örneği oluşturdum, ancak bu iki kaydedici aynı dosyaya yazmaya devam ediyor. Günlüğe kaydetme hedefini belirleyebileceğim bir yol olup olmadığını merak ediyorum, böylece iki kaydedici iki farklı dosyaya yazıyor.CocoaLumberjack FileLogger birden fazla dosyaya günlüğe kaydetme

+0

Ben aynı sorunu yaşıyorum. [Bu yazı] 'daki yaklaşımı denedim (http://stackoverflow.com/a/7762344/264775), fakat cihazda ya da simülatörde çalışmıyor. Çalışan bir yaklaşım buldunuz mu? – thegrinner

+0

SWIFT 2.2 projesinde Hockey ile Cocoalumberjack'ı entegre etme konusunda adım adım talimatlar aldığım bir belgeye veya bağlantıya sahip olabilir miyiz? Tüm linkler ve hokey uygulamaları web sitesi tüm uygulamaları objektif-c olarak gösterir. Teşekkürler! – Tejas

cevap

7

Bu çalışmayı gerçekleştirmenin anahtarı, her DDFileLogger'ı kendi DDLogFileManager'ına ve her biri için ayrı bir günlük dizin yolu ile kurmaktır. DDLogFileManager, hangi dosyanın oturum açacağını belirlemek için günlük dizini yolunu kullanır; böylece iki tanesi aynı dizine işaret ediyorsa, aynı günlük dosyasına giriş yapar. Bu nedenle anahtar, her bir günlük için ayrı dizinler kullanmaktır. "Bir" ve "İki": İki farklı günlük türleri için

sonra hala günlüğü yapmak için makro tanımlamak gerekir tabii

// Set the base log directory 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
NSString *baseDir = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 
NSString *logsDirectory = [baseDir stringByAppendingPathComponent:@"Logs"]; 

// set up file logger One to log to subdirectory "One" 
DDLogFileManagerDefault *fileManagerOne = [[DDLogFileManagerDefault alloc] initWithLogsDirectory:[logsDirectory stringByAppendingPathComponent:@"One"]]; 
DDFileLogger *loggerOne = [[DDFileLogger alloc] fileManagerOne]; 

// Use the filter formatter to make sure only "One" logs go to the "One" log files 
ContextWhitelistFilterLogFormatter *formatterOne = [[ContextWhitelistFilterLogFormatter alloc] init]; 
[formatterOne addToWhitelist:LOG_CONTEXT_ONE]; 
[loggerOne formatterOne]; 

[DDLog loggerOne]; 

    // set up file logger Two to log to subdirectory "Two" 
DDLogFileManagerDefault *fileManagerTwo = [[DDLogFileManagerDefault alloc] initWithLogsDirectory:[logsDirectory stringByAppendingPathComponent:@"Two"]]; 
DDFileLogger *loggerTwo = [[DDFileLogger alloc] fileManagerTwo]; 

// Use the filter formatter to make sure only "Two" logs go to the "Two" log files 
ContextWhitelistFilterLogFormatter *formatterTwo = [[ContextWhitelistFilterLogFormatter alloc] init]; 
[formatterTwo addToWhitelist:LOG_CONTEXT_TWO]; 
[loggerTwo formatterTwo]; 

[DDLog loggerTwo]; 
:

#define LOG_CONTEXT_ONE 1 
#define LOG_CONTEXT_TWO 2 

#define LogOne(frmt, ...) SYNC_LOG_OBJC_MACRO(0, 0, LOG_CONTEXT_ONE, frmt, ##__VA_ARGS__) 
#define LogTwo(frmt, ...) SYNC_LOG_OBJC_MACRO(0, 0, LOG_CONTEXT_TWO, frmt, ##__VA_ARGS__) 

Bu çalıştı budur benim için.

+0

Ayrıca, varsayılan içeriği 0 kullanarak ve loggerOne kodunu ekleyerek bunu basitleştirebilirsiniz. Daha sonra, bağlam 0 için varsayılan dosya günlüğünüze bir DDContextWhitelistFilterLogFormatter eklemeniz gerekir. – dbainbridge

+0

C99’da SYNC_LOG_OBJC_MACRO örtük beyanına izin verilmiyor. Bu konuda herkes yardımcı olabilir mi? –

0

Yeni bir özellik (her kayıt cihazı için farklı günlük seviyesi) kullanarak çok yakın bir şey elde edebilirsiniz. Bakınız https://github.com/robbiehanson/CocoaLumberjack/wiki/PerLoggerLogLevels. Hata kütükleri her iki dosyaya da gireceğinden, 2 dosya kaydedicisini (biri hata seviyesine sahip ve diğeri de ayrıntıya sahip olan) tanımladığınız gibi olmaz. Bu yeterince iyi mi?

+0

Ayrıca buna da ihtiyacım var ama önemli olan kayıtların ayrı dosyalara gitmesi. Yani her iki dosyaya girmesi en azından amacımı yener. – dbainbridge

2

Yukarıda üst cevabı hakkında yorum yapmak yeterli itibar yok, ama burada son CocoaLumberjack ile çalışır KabukiAdam en cevabın bir sürümü:

// Set the base log directory 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
NSString *baseDir = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 
NSString *logsDirectory = [baseDir stringByAppendingPathComponent:@"Logs"]; 

// set up file logger One to log to subdirectory "One" 
DDLogFileManagerDefault *fileManagerOne = [[DDLogFileManagerDefault alloc] initWithLogsDirectory:[logsDirectory stringByAppendingPathComponent:@"One"]]; 
DDFileLogger *loggerOne = [[DDFileLogger alloc] initWithLogFileManager:fileManagerOne]; 

// Use the filter formatter to make sure only "One" logs go to the "One" log files 
ContextWhitelistFilterLogFormatter *formatterOne = [[ContextWhitelistFilterLogFormatter alloc] init]; 
[formatterOne addToWhitelist:LOG_CONTEXT_ONE]; 
[loggerOne setLogFormatter:formatterOne]; 
[DDLog addLogger:loggerOne]; 

// set up file logger One to log to subdirectory "Two" 
DDLogFileManagerDefault *fileManagerTwo = [[DDLogFileManagerDefault alloc] initWithLogsDirectory:[logsDirectory stringByAppendingPathComponent:@"Two"]]; 
DDFileLogger *loggerTwo = [[DDFileLogger alloc] initWithLogFileManager:fileManagerTwo]; 

// Use the filter formatter to make sure only "Two" logs go to the "Two" log files ContextWhitelistFilterLogFormatter *formatterTwo = [[ContextWhitelistFilterLogFormatter alloc] init]; 
[formatterTwo addToWhitelist:LOG_CONTEXT_TWO]; 
[loggerTwo setLogFormatter:formatterTwo]; 
[DDLog addLogger:loggerTwo]; 
+0

SY99_LOG_OBJC_MACRO'nun örtük beyanına c99'da izin verilmez. Bu konuda herkes yardımcı olabilir mi? –

İlgili konular