2012-10-16 7 views
7

Korzystam z tej struktury CocoaLumberjack do rejestrowania wszystkich moich wiadomości w projekcie Objective-C. Teraz chcę zalogować wszystkie błędy do jednego pliku i wszystkich innych wiadomości do innego pliku. Wiem, że mogę użyć formatera do filtrowania tych informacji. Stworzyłem dwie instancje DDFileLogger w AppDelegate, ale te dwa rejestratory nadal zapisują do tego samego pliku. Zastanawiam się, czy istnieje sposób, żebym mógł określić miejsce docelowe rejestrowania, aby dwa rejestratory zapisywały do ​​dwóch różnych plików.CocoaLumberjack FileLogger logując się do wielu plików

+0

Mam ten sam problem. Próbowałem podejście w [ten post] (http://stackoverflow.com/a/7762344/264775), ale nie działa na urządzenie lub symulator. Czy znalazłeś podejście do pracy? – thegrinner

+0

Czy możemy mieć dokumentację lub link, gdzie otrzymuję instrukcje krok po kroku dotyczące integracji Cocoalumberjack z Hockey w projekcie SWIFT 2.2. Wszystkie strony z linkami i strony z aplikacjami hokejowymi pokazują wszystkie implementacje w celu-c. Dzięki! – Tejas

Odpowiedz

7

Kluczem do uzyskania tego działania jest skonfigurowanie każdego DDFileLoggera za pomocą własnego menedżera DDLogFileManager, z oddzielnymi ścieżkami do katalogów dziennika dla każdego z nich. DDLogFileManager używa ścieżki do katalogu dziennika, aby określić, do którego pliku należy się logować, więc jeśli dwa z nich wskazują ten sam katalog, będą logować się do tego samego pliku dziennika. Dlatego kluczem jest używanie oddzielnych katalogów dla każdego dziennika.

dla dwóch różnych typów dziennika: "One" i "dwa":

// 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]; 

wtedy oczywiście trzeba jeszcze zdefiniować makra zrobić swoją rejestrowanie:

#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__) 

To co pracował dla mnie.

+0

Możesz także uprościć to, używając domyślnego kontekstu 0 i dodając kod LoggerOne. Następnie wystarczy dodać DDContextWhitelistFilterLogFormatter dla kontekstu 0 do domyślnego rejestratora plików. – dbainbridge

+0

Niejawna deklaracja SYNC_LOG_OBJC_MACRO jest niedozwolona w c99. Czy ktoś może pomóc w związku z tym? –

0

Możesz osiągnąć coś bardzo blisko, używając nowej funkcji (inny poziom dziennika dla każdego rejestratora). Zobacz https://github.com/robbiehanson/CocoaLumberjack/wiki/PerLoggerLogLevels. Tworzenie 2 rejestratorów plików (jeden z poziomem błędu i drugi z pełnym verbose) nie jest dokładnie taki, jak opisałeś, ponieważ dzienniki błędów będą przesyłane do obu plików. Czy to wystarczająco dobre?

+0

Też potrzebuję tego, ale kluczową rzeczą jest to, aby rejestracja przebiegła w oddzielnych plikach. Więc jeśli przejdę do obu plików, przynajmniej pokonam mój cel. – dbainbridge

2

nie mam wystarczającej reputacji uwag na najwyższym odpowiedzi powyżej, ale tutaj jest to wersja odpowiedzi KabukiAdam, że współpracuje z najnowszymi CocoaLumberjack:

// 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

Niejawna deklaracja SYNC_LOG_OBJC_MACRO jest niedozwolona w c99. Czy ktoś może pomóc w związku z tym? –

Powiązane problemy