也可以将 swift println 日志写入文件吗?

Possible to write swift println logs into file too?

将日志写入文本文件也是一种简单的方法吗?当出现问题时,我需要一个崩溃日志来分析。但是我已经在代码中使用了 println。

使用String.writeToFile(<#path: String#>, atomically: <#Bool#>, encoding: <#NSStringEncoding#>, error: <#NSErrorPointer#>)

您可以添加:

#if DEBUG
func println(s:String) {
  var error:NSError? = nil
  let path = "/Users/<me>/dump.txt"
  var dump = String(contentsOfFile: path, encoding: NSUTF8StringEncoding, error: nil)!
  "\(dump)\n\(s)".writeToFile(path, atomically:true, encoding:NSUTF8StringEncoding, error:&error)
}
#endif

请参阅有关如何使用此编译器标志的 #if DEBUG 答案。

遗憾的是,使用基于 println() 的解决方案不会导致输出被 Apple 系统日志 (ASL) 捕获。

ASL 是由 Mac OS 和 iOS 提供的日志工具,由 NSLog() 使用(在 Mac 上可见通过控制台应用程序)。因为 NSLog() 使用 ASL,所以 NSLog() 记录的日志条目将通过设备控制台可见。通过 println() 记录的消息将不会在 ASL 中捕获,因此,在发生某些事情后,没有机会返回控制台进行诊断。

The CleanroomLogger open-source project 提供了一个可扩展的 Swift API,您可以使用它来做您想做的事情。除了 ASLLogRecorder.

之外,您只需实施 LogRecorder 并在配置中指定它

对于 swift 3,像这样更改 Thomas Killan 的代码

func println(s:String) {
    let path = "/Users/<me>/dump.txt"
    var dump = ""
    if FileManager.default.fileExists(atPath: path) {
        dump =  try! String(contentsOfFile: path, encoding: String.Encoding.utf8)
    }
    do {
        // Write to the file
        try  "\(dump)\n\(s)".write(toFile: path, atomically: true, encoding: String.Encoding.utf8)

    } catch let error as NSError {
        print("Failed writing to log file: \(path), Error: " + error.localizedDescription)
    }
}

我稍微修改了你的功能,使其成为全局功能,并添加了每天保存一个日志。

public func debugPrint(s:String)
{
  var paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
  let documentsDirectory = paths[0]
  let formatter = DateFormatter()
  formatter.dateFormat = "dd-MM-yyyy"
  let dateString = formatter.string(from: Date())
  let fileName = "\(dateString).log"
  let logFilePath = (documentsDirectory as NSString).appendingPathComponent(fileName)
  var dump = ""

  if FileManager.default.fileExists(atPath: logFilePath) {
      dump =  try! String(contentsOfFile: logFilePath, encoding: String.Encoding.utf8)
  }

  do {
      // Write to the file
      try  "\(dump)\n\(Date()):\(s)".write(toFile: logFilePath, atomically: true, encoding: String.Encoding.utf8)
      
  } catch let error as NSError {
      print("Failed writing to log file: \(logFilePath), Error: " + error.localizedDescription)
  }
}