Where is Logfile stored using cocoaLumberjack Where is Logfile stored using cocoaLumberjack ios ios

Where is Logfile stored using cocoaLumberjack


You can download the log files from connected device, or you can send directly from app. Both approaches are described below.

Send log files from app through email, in Swift

Write this in the class where you have a reference to DDFileLogger. I would put this in a custom logger class e.g. MyLogger.swift

var ddFileLogger: DDFileLogger!var logFileDataArray: [NSData] {    get {        let logFilePaths = ddFileLogger.logFileManager.sortedLogFilePaths() as! [String]        var logFileDataArray = [NSData]()        for logFilePath in logFilePaths {            let fileURL = NSURL(fileURLWithPath: logFilePath)            if let logFileData = try? NSData(contentsOfURL: fileURL, options: NSDataReadingOptions.DataReadingMappedIfSafe) {                // Insert at front to reverse the order, so that oldest logs appear first.                logFileDataArray.insert(logFileData, atIndex: 0)            }        }        return logFileDataArray    }}

Then, when user taps on a button to indicate that they want to send the logs,

// Required by MFMailComposeViewControllerimport MessageUI@IBAction func writeEmailTapped(sender: AnyObject) {    if MFMailComposeViewController.canSendMail() {        let composeVC = MFMailComposeViewController()        composeVC.mailComposeDelegate = self        // Configure the fields of the interface.        composeVC.setToRecipients(["your-email@company.com"])        composeVC.setSubject("Feedback for app")        composeVC.setMessageBody("", isHTML: false)        let attachmentData = NSMutableData()        for logFileData in MyLogger.sharedInstance.logFileDataArray {            attachmentData.appendData(logFileData)        }        composeVC.addAttachmentData(attachmentData, mimeType: "text/plain", fileName: "diagnostic.log")        self.presentViewController(composeVC, animated: true, completion: nil)    } else {        // Tell user about not able to send email directly.    }}

This results in a compose email pop-up with an attachment file named diagnostic.log, which is all the log files concatenated together.

Special thanks - This is pretty much a Swift translation from the Objective-C version given by the other answer.

Get log file(s) from device directly, through USB cable

If you want to get the log files that your app created while running on device,

  1. Connect your device to your mac
  2. In Xcode, go to Window -> Devices
  3. On top-left in the device list, click on the connected device.
  4. In the main panel, under Installed Apps section, click on the application in which you ran CocoaLumberjack.
  5. At the bottom of the Installed Apps list, click on the gear icon and then Download Container.
  6. In Finder, right click (show menu) on the saved .xcappdata file and select Show Package Contents
  7. Log files are saved in /AppData/Library/Caches/Logs/

Up-vote would be nice if this is helpful to you!


The answers here don't seem to account for the fact that there may be multiple log files. You can use your DDFileLogger instance's logFileManager property to loop through file information. Check out DDFileLogger.h for public methods and properties. The following may be of use:

- (NSString *)logsDirectory;- (NSArray *)unsortedLogFilePaths;- (NSArray *)unsortedLogFileNames;- (NSArray *)unsortedLogFileInfos;- (NSArray *)sortedLogFilePaths;- (NSArray *)sortedLogFileNames;- (NSArray *)sortedLogFileInfos;

Here is my solution for getting log data (and emailing it). Note that the default number of log files is 5 as of this writing.

- (NSMutableArray *)errorLogData {    NSUInteger maximumLogFilesToReturn = MIN([KRLogManager sharedInstance].fileLogger.logFileManager.maximumNumberOfLogFiles, 10);    NSMutableArray *errorLogFiles = [NSMutableArray arrayWithCapacity:maximumLogFilesToReturn];    DDFileLogger *logger = [KRLogManager sharedInstance].fileLogger;    NSArray *sortedLogFileInfos = [logger.logFileManager sortedLogFileInfos];    for (int i = 0; i < MIN(sortedLogFileInfos.count, maximumLogFilesToReturn); i++) {        DDLogFileInfo *logFileInfo = [sortedLogFileInfos objectAtIndex:i];        NSData *fileData = [NSData dataWithContentsOfFile:logFileInfo.filePath];        [errorLogFiles addObject:fileData];    }    return errorLogFiles;}- (void)composeEmailWithDebugAttachment {    if ([MFMailComposeViewController canSendMail]) {        MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init];        mailViewController.mailComposeDelegate = self;        NSMutableData *errorLogData = [NSMutableData data];        for (NSData *errorLogFileData in [self errorLogData]) {            [errorLogData appendData:errorLogFileData];        }        [mailViewController addAttachmentData:errorLogData mimeType:@"text/plain" fileName:@"errorLog.txt"];        [mailViewController setSubject:NSLocalizedString(@"Good Subject", @"")];        [mailViewController setToRecipients:[NSArray arrayWithObject:@"some@email.com"]];        [self presentModalViewController:mailViewController animated:YES];    }    else {        NSString *message = NSLocalizedString(@"Sorry, your issue can't be reported right now. This is most likely because no mail accounts are set up on your mobile device.", @"");        [[[UIAlertView alloc] initWithTitle:nil message:message delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", @"") otherButtonTitles: nil] show];    }}


If you're using CocoaLumberjack, you have DDFileLogger.h and you can expose the currentLogFileInfo: method that is implemented already:

@interface DDFileLogger : DDAbstractLogger <DDLogger>...- (DDLogFileInfo *)currentLogFileInfo;@end

Then, you can programmatically access the path to the current file with:

// configure loggerDDFileLogger *fileLogger = [DDFileLogger new];[DDLog addLogger:fileLogger];[DDLog addLogger:[DDTTYLogger sharedInstance]];DDLogInfo(@"log file at: %@", [[fileLogger currentLogFileInfo] filePath]);

Which, on my iPhone, printed:

log file at: /var/mobile/Applications/3BE1219F-78BE-491C-B68C-74D6FA0C2EF1/Library/Caches/Logs/log-5D1286.txt

to both the console and the file.