Я задаю этот вопрос, потому что все ответы, которые я нашел в Интернете, либо устарели, либо не работают для меня.
Я работаю со структурой клиентов, и по какой-то причине они требуют, чтобы я использовал 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 ()
Что я делаю не так?