Использование Cocoalumberjack в Swift-проекте - PullRequest
0 голосов
/ 23 октября 2019

Я задаю этот вопрос, потому что все ответы, которые я нашел в Интернете, либо устарели, либо не работают для меня.

Я работаю со структурой клиентов, и по какой-то причине они требуют, чтобы я использовал CocoaLumberjack в проекте, поэтому любые предложения по другим инструментам Log бесполезны для меня, по крайней мере, для этого проекта, спасибо заранеедля понимания

Вопрос:

Как получить логи от пользователей? Я не настолько знаком с ведением журнала, так что это все для меня в новинку.

Я написал некоторый код с помощью многочисленных SO-ответов и документации CocoaLumberjacks на Github.

Я почти уверен, что на самом деле я веду журнал, потому что я могу получить журналы из XCode, когда я запускаю свое приложение на реальном устройстве, выполнив: XCode -> Window -> Устройства и симуляторы -> Выберите устройство(и приложение) -> Скачать контейнер.

Из контейнера я вижу логи. Но как я могу увидеть логи пользователя, которые физически здесь не находятся на его устройстве?

AppDelegate.swift:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool  {
    let formatter = LogFormatter()
    DDTTYLogger.sharedInstance.logFormatter = formatter

return true
}

мой logformatter из StackOverflow https://stackoverflow.com/a/14000342/4189589

class LogFormatter: NSObject, DDLogFormatter {
    let dateFormatter: DateFormatter

    static let sharedInstance = LogFormatter()

    override init() {
        dateFormatter = DateFormatter()
        dateFormatter.formatterBehavior = .behavior10_4
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss:SSS"

        DDLog.add(DDOSLogger.sharedInstance) // Uses os_log

        let fileLogger: DDFileLogger = DDFileLogger() // File Logger
        fileLogger.rollingFrequency = 60 * 60 * 24 // 24 hours
        fileLogger.logFileManager.maximumNumberOfLogFiles = 7
        DDLog.add(fileLogger)


        DDLogDebug("Debug")
        DDLogVerbose("Verbose")
        DDLogInfo("Info")
        DDLogWarn("Warn")
        DDLogError("Error")


        super.init()
    }
    func format(message logMessage: DDLogMessage) -> String? {
        let dateAndTime = dateFormatter.string(from: logMessage.timestamp)
        return "\(dateAndTime) [\(logMessage.fileName):\(logMessage.line)]: \(logMessage.message)"
    }


    var ddFileLogger: DDFileLogger!

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

А затем я хочу отправить журналы по электронной почте с помощью кнопки (из того жеSO-ответ)

func emailLogsTo(email: String) {
        if MFMailComposeViewController.canSendMail() {
            let composeVC = MFMailComposeViewController()
            composeVC.mailComposeDelegate = self

            // Configure the fields of the interface.
            composeVC.setToRecipients([email])
            composeVC.setSubject("Feedback for app")
            composeVC.setMessageBody("", isHTML: false)

            let attachmentData = NSMutableData()
            for logFileData in LogFormatter.sharedInstance.logFileDataArray {
                attachmentData.append(logFileData as Data)
            }
            composeVC.addAttachmentData(attachmentData as Data, mimeType: "text/plain", fileName: "diagnostic.log")
            self.present(composeVC, animated: true, completion: nil)
        } else {
            // Tell user about not able to send email directly.
        }
    }

Что происходит, когда я вызываю функцию для отправки электронной почты, так это то, что я получаю «неожиданно найденный ноль при неявном развертывании необязательного значения» - ошибка на

let logFilePaths = ddFileLogger.logFileManager.sortedLogFilePaths

в LogFormatter ()

Что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...