自从上次回答以来已经过了几年,尽管@atineoSE的答案完美无缺,但我使用了一个类,其中的日期格式化程序和文件URL只创建一次,您可以通过单个调用在任何地方使用它。
以下是Logger.swift文件的代码:
class Logger {
private static let shared = Logger()
private var fileURL:URL?
private var dateFormatter:DateFormatter?
private init() {
print("Logger -> Init")
self.dateFormatter = DateFormatter()
self.dateFormatter?.dateFormat = "HH:mm:ss"
let fileName = "APPNAME Log - \(Date()).log"
guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
print("Logger -> Documents directory could not be accessed")
return
}
self.fileURL = documentsDirectory.appendingPathComponent(fileName)
print("Logger -> Final file url path: \(String(describing: self.fileURL?.path))")
}
static func log(_ message: String) {
let logger = Logger.shared
guard let fileURL = logger.fileURL,
let dateFormatter = logger.dateFormatter else {
print("Logger -> FileURL/Dateformatter not accessible")
return
}
let timestamp = dateFormatter.string(from: Date())
let stringToWrite = timestamp + ": " + message + "\n"
guard let data = stringToWrite.data(using: String.Encoding.utf8) else {
print("Logger -> Failed to create data from string")
return
}
if FileManager.default.fileExists(atPath: fileURL.path) {
do {
let fileHandle = try FileHandle(forWritingTo: fileURL)
fileHandle.seekToEndOfFile()
fileHandle.write(data)
fileHandle.closeFile()
}
catch {
print("Logger -> Error creating filehandle: \(error)")
}
return
}
do {
try data.write(to: fileURL, options: .atomicWrite)
}
catch {
print("Logger -> Error writing to file: \(error)")
}
}
}
每当你想使用它的时候,你可以简单地像这样做:
Logger.log("Some string I want to save in the file!")
作为一个额外的好处,这里有一个快速函数,我只是把它放在一个Swift文件中(不是一个类,只是一个Swift文件,在这个文件的最底层放入这段代码),它会自动将文件名和函数名放入字符串中(并且也会打印到控制台)。
func DLog(_ message: String, filename: String = #file, function: String = #function, line: Int = #line) {
let string = "[\((filename as NSString).lastPathComponent):\(line)] \(function) - \(message)"
print("\(string)")
Logger.log(string)
}
你可以在任何地方像这样使用这个DLog函数:
DLog("String to print AND write to a file")