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
risposta
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.
È 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
La dichiarazione implicita di SYNC_LOG_OBJC_MACRO non è consentita in c99. Qualcuno può aiutare per quanto riguarda questo ?? –
È 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?
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
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];
La dichiarazione implicita di SYNC_LOG_OBJC_MACRO non è consentita in c99. Qualcuno può aiutare per quanto riguarda questo ?? –
- 1. Metodo Const che accede a variabili statiche
- 2. Pandas DataFrame: accede a più elementi con non uguale a, =!
- 3. Console di registrazione che accede a Chrome in modo persistente
- 4. CocoaLumberjack e NSLog in altre librerie
- 5. TSQL: Creare una visualizzazione che accede più database
- 6. jQuery che accede a IE: come ottenere l'oggetto?
- 7. Quando si accede a più istanze Spring Singleton contemporaneamente
- 8. Ruby accede a più array elemenet per indici (sotto array)
- 9. Come stub CocoaLumberjack o NSLog con OCMockito
- 10. Più thread che leggono dallo stesso file
- 11. Integrazione di CocoaLumberjack nel progetto iOS tramite Drag-and-Drop
- 12. Spring 3 MVC che accede a HttpRequest dal controller
- 13. Ruby che accede a variabili esterne nella funzione nidificata
- 14. Swift che accede al dizionario EXIF
- 15. Classe interna che accede alla classe esterna
- 16. WebClient che accede alla pagina con credenziali
- 17. iframe che accede al DOM padre?
- 18. Django che accede ai dati dei formset
- 19. Più utenti che scrivono sullo stesso file
- 20. Angularjs accede ai file json locali
- 21. onPageFinished richiede più di 2 minuti quando l'URL accede direttamente
- 22. più autorizzazioni a caricato APK che nel file manifesto
- 23. Perl: Hash ref che accede alla serie di chiavi
- 24. Authlogic che accede all'ID utente nell'oggetto di sessione
- 25. Selenium WebDriver accede a un elemento secondario
- 26. Parse Apache accede a PHP utilizzando preg_match
- 27. Il riferimento al file CocoaPods è un membro di più gruppi
- 28. di programmazione si accede a un iframe che utilizza un URI di dati come fonte
- 29. Come si accede a ARGV in Mathematica?
- 30. Come si accede a Firebug da un'estensione?
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
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