Где хранится лог-файл с помощью cocoaLumberjack - PullRequest
53 голосов
/ 20 июня 2011

Я использую фреймворк CocoaLumberjack для регистрации в iOS. Для хранения логов в файле я использовал этот код.

DDFileLogger* fileLogger = [[DDFileLogger alloc] init];
fileLogger.rollingFrequency = 60 * 60 * 24; 
fileLogger.logFileManager.maximumNumberOfLogFiles = 7;

[DDLog addLogger:fileLogger];

DDLogVerbose(@"hello");
NSLog(@"hihihihihi");

Я не могу найти, где именно хранится файл журнала, сгенерированный этим кодом. Может кто-нибудь помочь мне с этой проблемой?

Ответы [ 8 ]

63 голосов
/ 18 июля 2012

Ответы здесь, похоже, не учитывают тот факт, что может быть несколько файлов журнала.Вы можете использовать свойство logFileManager вашего экземпляра DDFileLogger, чтобы просмотреть информацию о файле.Проверьте DDFileLogger.h для открытых методов и свойств.Может пригодиться следующее:

- (NSString *)logsDirectory;

- (NSArray *)unsortedLogFilePaths;
- (NSArray *)unsortedLogFileNames;
- (NSArray *)unsortedLogFileInfos;

- (NSArray *)sortedLogFilePaths;
- (NSArray *)sortedLogFileNames;
- (NSArray *)sortedLogFileInfos;

Вот мое решение для получения данных журнала (и отправки по электронной почте).Обратите внимание, что число файлов журналов по умолчанию на момент написания этой статьи равно 5.

- (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];
    }
}
60 голосов
/ 22 декабря 2012

Вы можете загрузить файлы журнала с подключенного устройства или отправить напрямую из приложения. Оба подхода описаны ниже.

Отправка файлов журнала из приложения по электронной почте, в Swift

Запишите это в классе, где у вас есть ссылка на DDFileLogger. Я бы поместил это в пользовательский класс логгера, например 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
    }
}

Затем, когда пользователь нажимает на кнопку, чтобы указать, что он хочет отправить журналы,

// Required by MFMailComposeViewController
import 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.
    }
}

Это приводит к появлению всплывающего электронного письма с вложенным файлом с именем diagnostic.log, который представляет собой все файлы журнала, объединенные вместе.

Особая благодарность - Это в значительной степени перевод Swift с версии Objective-C, приведенной в другом ответе.

Получение файлов журнала с устройства напрямую через USB-кабель

Если вы хотите получить файлы журнала, созданные вашим приложением во время работы на устройстве,

  1. Подключите ваше устройство к вашему Mac
  2. В Xcode, зайдите в Окно -> Устройства
  3. В левом верхнем углу списка устройств нажмите на подключенное устройство.
  4. На главной панели в разделе Установленные приложения выберите приложение, в котором вы запустили CocoaLumberjack.
  5. В нижней части списка установленных приложений щелкните значок шестеренки, а затем - Скачать контейнер.
  6. В Finder щелкните правой кнопкой мыши (показать меню) на сохраненном файле .xcappdata и выберите «Показать содержимое пакета»
  7. Файлы журнала сохраняются в /AppData/Library/Caches/Logs/

Было бы неплохо, если бы это было полезно для вас!

29 голосов
/ 10 июля 2012

Если вы используете CocoaLumberjack, у вас есть DDFileLogger.h, и вы можете предоставить метод currentLogFileInfo:, который уже реализован:

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

Затем вы можете программно получить доступ к пути к текущему файлу с помощью:

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

Который на моем iPhone напечатан:

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

для консоли и файла.

15 голосов
/ 28 сентября 2013

Вы можете контролировать, где он хранится, например, я иногда сохраняю его в папке iTunes для удобства поиска. Используйте это в AppDelegate при настройке fileLogger:

NSString * applicationDocumentsDirectory = [[[[NSFileManager defaultManager]    
     URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] path];
DDLogFileManagerDefault *documentsFileManager = [[DDLogFileManagerDefault alloc]
     initWithLogsDirectory:applicationDocumentsDirectory];
DDFileLogger *fileLogger = [[DDFileLogger alloc]
     initWithLogFileManager:documentsFileManager];
8 голосов
/ 18 февраля 2014

Найдено самое позднее:

DDFileLogger *fileLogger = [[DDFileLogger alloc] init];

fileLogger.logFileManager.logsDirectory;//THIS

Из официального кода:

Менеджер файлов журнала по умолчанию.

Все файлы журнала размещены внутрикаталог журналов.Если определенный каталог logsDirectory не указан, используется каталог по умолчанию.На Mac это находится в ~ / Library / Logs /.На iPhone это находится в ~ / Library / Caches / Logs.Файлы журнала называются «log-.txt», где uuid представляет собой шестнадцатеричный шестизначный символ, состоящий из набора [0123456789ABCDEF].Архивные файлы журнала автоматически удаляются в соответствии со свойством MaximumNumberOfLogFiles.

6 голосов
/ 21 июня 2011

Получил ответ

Он хранится в Библиотеке / Поддержка приложений / Iphone Simulator / # версия № # / приложения / # ваше приложение # / документы / журналы / log-3hex нет>

4 голосов
/ 04 октября 2016

Отправить файлы журнала из приложения по электронной почте, в Objective-C

Objective-C код:

В вашем заголовке:

#import <MessageUI/MessageUI.h>
#import "DDLog.h"
#import "DDFileLogger.h"

В вашей реализации:

- (NSMutableArray *)errorLogData {
    DDFileLogger *ddFileLogger = [DDFileLogger new];
    NSArray <NSString *> *logFilePaths = [ddFileLogger.logFileManager sortedLogFilePaths];
    NSMutableArray <NSData *> *logFileDataArray = [NSMutableArray new];
    for (NSString* logFilePath in logFilePaths) {
        NSURL *fileUrl = [NSURL fileURLWithPath:logFilePath];
        NSData *logFileData = [NSData dataWithContentsOfURL:fileUrl options:NSDataReadingMappedIfSafe error:nil];
        if (logFileData) {
            [logFileDataArray insertObject:logFileData atIndex:0];
        }
    }
    return logFileDataArray;
}

- (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:@"filename.log"];
        [mailViewController setSubject:NSLocalizedString(@"LogFile Subject", @"")];
        [mailViewController setToRecipients:[NSArray arrayWithObject:@"email@email.com"]];

        [self presentViewController:mailViewController animated:YES completion:nil];

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

- (void)mailComposeController:(MFMailComposeViewController *)mailer didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
    [self becomeFirstResponder];
    [mailer dismissViewControllerAnimated:YES completion:nil];
}

Вот как вы можете добавить что-то в свой лог-файл:

DDLogError(@"This is an error.");
DDLogWarn(@"This is a warning.");
DDLogInfo(@"This is just a message.");
DDLogVerbose(@"This is a verbose message.");

Не забудьте установить свой ddLogLevel в вашем файле констант.

Constants.h:

extern NSUInteger const ddLogLevel;

Константы.m:

NSUInteger const ddLogLevel =
#ifdef DEBUG
LOG_LEVEL_VERBOSE;
#else
LOG_LEVEL_ERROR;
#endif

Это очень очевидно, но не забудьте настроить CocoaLumberjack в вашем файле AppDelegate.m .

[DDLog addLogger:[DDASLLogger sharedInstance]];
[DDLog addLogger:[DDTTYLogger sharedInstance]];

DDFileLogger *fileLogger = [[DDFileLogger alloc] init];
[fileLogger setMaximumFileSize:(1024 * 1024)];
[fileLogger setRollingFrequency:(3600.0 * 24.0)];
[[fileLogger logFileManager] setMaximumNumberOfLogFiles:7];
[DDLog addLogger:fileLogger];

Лучшее место для вставки этого кода - - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; в файл AppDelegate.m .Также вы должны добавить эту строку кода в заголовок AppDelegate.m :

#import <CocoaLumberjack/CocoaLumberjack.h>

Надеюсь, это поможет.

0 голосов
/ 13 марта 2019

Мне пришлось немного переписать, чтобы быть совместимым со Swift 4 ...

var logFileDataArray: [Data] {
    let logFilePaths = delegate.fileLogger.logFileManager.sortedLogFilePaths
    var logFileDataArray = [Data]()
    for logFilePath in logFilePaths {
        let fileURL = URL(fileURLWithPath: logFilePath)
        if let logFileData =
            try? Data(contentsOf: fileURL, options: Data.ReadingOptions.mappedIfSafe) {
            logFileDataArray.insert(logFileData, at: 0)
        }
    }
    return logFileDataArray
}

func sendApplicationLog(text: String) {
    if MFMailComposeViewController.canSendMail() {
        let controller = MFMailComposeViewController()
        controller.mailComposeDelegate = self
        controller.setToRecipients(["dohan.rene@gmail.com"])
        controller.setSubject("Log of motorkari iOS")
        controller.setMessageBody(text, isHTML: false)
        var attachmentData = Data()
        for logFileData in logFileDataArray { attachmentData.append(logFileData) }
        controller.addAttachmentData(attachmentData, mimeType: "text/plain",
                                    fileName: "motorkari_ios_application.log")
        present(controller, animated: true, completion: nil)
    } else {
        showMessage("Log cannot be send !")
    }
}
...