Ich verwende dieses CocoaLumberjack-Framework, um alle meine Nachrichten in Objective-C-Design zu protokollieren. Jetzt möchte ich alle Fehler in einer Datei und alle anderen Nachrichten in einer anderen Datei protokollieren. Ich weiß, ich könnte Formatierer verwenden, um diese Informationen zu filtern. Ich habe zwei DDFileLogger-Instanzen in AppDelegate erstellt, aber diese beiden Protokollierer schreiben weiterhin in dieselbe Datei. Ich frage mich, ob es eine Möglichkeit gibt, das Logging-Ziel anzugeben, so dass zwei Logger in zwei verschiedene Dateien schreiben.CocoaLumberjack FileLogger Protokollierung in mehrere Dateien
Antwort
Der Schlüssel zum Erreichen dieser Funktion besteht darin, jeden DDFileLogger mit seinem eigenen DDLogFileManager einzurichten, mit separaten Protokollverzeichnispfaden für jeden. DDLogFileManager verwendet den Protokollverzeichnispfad, um zu bestimmen, an welche Datei sich ein Protokoll anlegt. Wenn Sie also zwei auf dasselbe Verzeichnis verweisen, werden sie in derselben Protokolldatei protokolliert. Der Schlüssel besteht also darin, separate Verzeichnisse für jedes Protokoll zu verwenden.
Für zwei verschiedene Protokolltypen: "One" und "Two":
// 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];
dann natürlich müssen Sie noch Makros definieren Sie Ihre Protokollierung zu tun:
#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__)
Dies ist, was funktioniert hat für mich.
Sie können dies auch vereinfachen, indem Sie den Standardkontext 0 verwenden und den loggerOne-Code hinzufügen. Sie müssen dann nur einen DDContextWhitelistFilterLogFormatter für den Kontext 0 zu Ihrem Standarddateilogger hinzufügen. – dbainbridge
Implizite Deklaration von SYNC_LOG_OBJC_MACRO ist in c99 nicht erlaubt. Kann mir jemand diesbezüglich helfen ?? –
Sie können etwas sehr nah erreichen, indem Sie eine neue Funktion verwenden (unterschiedliche Protokollebene für jeden Logger). Siehe https://github.com/robbiehanson/CocoaLumberjack/wiki/PerLoggerLogLevels. Erstellen von 2 Datei-Logger (einer mit Fehler-Ebene und der andere mit ausführlichen) wäre nicht genau wie beschrieben, da die Fehler-Logs in beide Dateien gehen. Ist das gut genug?
Ich brauche das auch, aber das Wichtigste ist, dass das Logging in separate Dateien geht. Wenn es in beide Dateien passt, besiegt es zumindest meinen Zweck. – dbainbridge
Ich habe nicht genug Ruf auf der Top-Antwort oben zu kommentieren, aber hier ist eine Version der Antwort KabukiAdam ist, die mit dem neuesten CocoaLumberjack funktioniert:
// 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];
Implizite Deklaration von SYNC_LOG_OBJC_MACRO ist in c99 nicht erlaubt. Kann mir jemand diesbezüglich helfen ?? –
ich das gleiche Problem haben. Versuchte den Ansatz in [diesem Beitrag] (http://stackoverflow.com/a/7762344/264775), aber es funktioniert nicht auf dem Gerät oder dem Simulator. Haben Sie einen Arbeitsansatz gefunden? – thegrinner
Können wir eine Dokumentation oder einen Link haben, wo ich Schritt für Schritt Anleitung zur Integration von Cocoalumberjack mit Hockey in SWIFT 2.2 Projekt bekommen. Alle Links und Hockey Apps Website zeigt alle Implementierungen in objective-c. Vielen Dank! – Tejas