在上一篇文章中:Swift - 实现日志输出的封装1(显示出调用的文件名、方法、行号)。我演示了如何封装实现一个日志输出的全局函数。但由于日志都是直接打印到控制台上,如果程序重启后原先的日志信息就会被清空。
文本对日志封装方法做个功能改进,日志除了输出到控制台外,还会同时写到本地文件中去。
1,日志封装代码
这里我将日志信息写到应用的 Caches文件夹中(Library/Caches/log.txt)
为了让日志信息更加丰富,再将日志写到文件中时还会附上调用的日期时间。
//封装的日志输出功能(T表示不指定日志信息参数类型)
func HGLog(_ message:T, file:String = #file, function:String = #function,
line:Int = #line) {
#if DEBUG
//获取文件名
let fileName = (file as NSString).lastPathComponent
//日志内容
let consoleStr = "\(fileName):\(line) \(function) | \(message)"
//打印日志内容
print(consoleStr)
// 创建一个日期格式器
let dformatter = DateFormatter()
// 为日期格式器设置格式字符串
dformatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
// 使用日期格式器格式化当前日期、时间
let datestr = dformatter.string(from: Date())
//将内容同步写到文件中去(Caches文件夹下)
let cachePath = FileManager.default.urls(for: .cachesDirectory,
in: .userDomainMask)[0]
let logURL = cachePath.appendingPathComponent("log.txt")
appendText(fileURL: logURL, string: "\(datestr) \(consoleStr)")
#endif
}
//在文件末尾追加新内容
func appendText(fileURL: URL, string: String) {
do {
//如果文件不存在则新建一个
if !FileManager.default.fileExists(atPath: fileURL.path) {
FileManager.default.createFile(atPath: fileURL.path, contents: nil)
}
let fileHandle = try FileHandle(forWritingTo: fileURL)
let stringToWrite = "\n" + string
//找到末尾位置并添加
fileHandle.seekToEndOfFile()
fileHandle.write(stringToWrite.data(using: String.Encoding.utf8)!)
} catch let error as NSError {
print("failed to append: \(error)")
}
}
2,使用样例import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
HGLog("程序启动!")
doSomething()
}
func doSomething() {
HGLog("欢迎访问hangge.com")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
3,运行效果
(1)我这里运行了两次程序,可以看到 Caches文件夹下已经生成了日志文件。
(2)打开日志文件,其内容如下。