当前位置: > > > Swift - 实现日志输出的封装2(同步记录到文件中去)

Swift - 实现日志输出的封装2(同步记录到文件中去)

在上一篇文章中:Swift - 实现日志输出的封装1(显示出调用的文件名、方法、行号)。我演示了如何封装实现一个日志输出的全局函数。但由于日志都是直接打印到控制台上,如果程序重启后原先的日志信息就会被清空。
文本对日志封装方法做个功能改进,日志除了输出到控制台外,还会同时写到本地文件中去。


1,日志封装代码

  • 这里我将日志信息写到应用的 Caches 文件夹中(Library/Caches/log.txt
  • 为了让日志信息更加丰富,再将日志写到文件中时还会附上调用的日期时间。
//封装的日志输出功能(T表示不指定日志信息参数类型)
func HGLog<T>(_ 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)打开日志文件,其内容如下。

评论1
  • 1楼
    2017-06-07 17:30
    dolphinNEUQ

    航哥,您好,我想问您一下,该怎么进入Caches文件夹?

    站长回复

    你指的是模拟器还是真机,模拟器的话直接使用Finder进入到Caches文件夹就好了。不知道具体路径的话,可以在程序启动时打印一下:

    let cachePath = NSHomeDirectory() + "/Library/Caches"
    print(cachePath)