2012-10-16 7 views
7

Sto usando questo framework CocoaLumberjack per registrare tutti i miei messaggi in Objective-C design. Ora voglio registrare tutti gli errori in un file e tutti gli altri messaggi in un altro file. So che potrei usare il formattatore per filtrare queste informazioni. Ho creato due istanze di DDFileLogger in AppDelegate ma questi due logger continuano a scrivere nello stesso file. Mi chiedo se c'è un modo per specificare la destinazione di registrazione in modo che due registratori scrivano su due file diversi.FileLogger di CocoaLumberjack che accede a più file

+0

Sto avendo lo stesso problema. Ho provato l'approccio in [questo post] (http://stackoverflow.com/a/7762344/264775), ma non funziona sul dispositivo o sul simulatore. Hai trovato un approccio lavorativo? – thegrinner

+0

Possiamo avere una documentazione o un collegamento dove ricevo istruzioni passo passo sull'integrazione di Cocoalumberjack con Hockey nel progetto SWIFT 2.2. Tutti i collegamenti e il sito Web delle app di hockey mostrano tutte le implementazioni nell'obiettivo-c. Grazie! – Tejas

risposta

7

La chiave per ottenere questo funzionamento è impostare ciascun DDFileLogger con il proprio DDLogFileManager, con percorsi di directory di registro separati per ciascuno. DDLogFileManager utilizza il percorso della directory di registro per determinare a quale file accedere, quindi se due di essi puntano alla stessa directory, accedono allo stesso file di registro. Quindi la chiave è usare directory separate per ogni registro.

Per due diversi tipi di registro: "One" e "Due":

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

poi, naturalmente, è ancora necessario definire le macro per fare la tua registrazione:

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

Questo è ciò che ha funzionato per me.

+0

È inoltre possibile semplificare questo utilizzando il contesto predefinito 0 e aggiungendo il codice loggerOne. È quindi necessario aggiungere un DDContextWhitelistFilterLogFormatter per il contesto 0 al registratore di file predefinito. – dbainbridge

+0

La dichiarazione implicita di SYNC_LOG_OBJC_MACRO non è consentita in c99. Qualcuno può aiutare per quanto riguarda questo ?? –

0

È possibile ottenere qualcosa di molto vicino utilizzando una nuova funzione (livello di registro diverso per ogni registratore). Vedi https://github.com/robbiehanson/CocoaLumberjack/wiki/PerLoggerLogLevels. La creazione di 2 registratori di file (uno con livello di errore e l'altro con dettagli) non è esattamente come descritto, poiché i log degli errori verranno inseriti in entrambi i file. È abbastanza buono?

+0

Ho anche bisogno di questo, ma la cosa fondamentale è avere il log in file separati. Quindi averlo in entrambi i file sconfigge almeno il mio scopo. – dbainbridge

2

io non ho abbastanza fama di commentare la risposta superiore sopra, ma ecco una versione di risposta di KabukiAdam che funziona con l'ultima 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

La dichiarazione implicita di SYNC_LOG_OBJC_MACRO non è consentita in c99. Qualcuno può aiutare per quanto riguarda questo ?? –

Problemi correlati