iOS Swift:将打印内容和调试打印内容写入文件

时间:2018-11-20 12:05:56

标签: ios swift xcode debugging printing

晚上,是否可以将所有打印和调试打印保存到文件中?

即使没有从Xcode启动,我也希望获得我的应用程序执行的日志。

我当时正在考虑覆盖print和debugPrint方法,并将输入内容写入文件中。

谢谢

3 个答案:

答案 0 :(得分:4)

Swift标准库中有一些方法:

func print<Target>(_ items: Any..., separator: String = default, terminator: String = default, to output: inout Target) where Target : TextOutputStream

func debugPrint<Target>(_ items: Any..., separator: String = default, terminator: String = default, to output: inout Target) where Target : TextOutputStream

您可以创建一个实现TextOutputStream的对象,该对象会将消息保存到您选择的文件中。如果您在代码库中已有打印,这将非常有用。然后,您可以将其他参数添加到它们中。请记住,这些打印将停止记录到标准输出(控制台)。

Documentation for print

Documentation for debugPrint

示例:

final class LogDestination: TextOutputStream {
  private let path: String
  init() {
    let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
    path = paths.first! + "/log"
  }

  func write(_ string: String) {
    if let data = string.data(using: .utf8), let fileHandle = FileHandle(forWritingAtPath: path) {
      defer {
        fileHandle.closeFile()
      }
      fileHandle.seekToEndOfFile()
      fileHandle.write(data)
    }
  }
}

然后

// I would probably use Singleton for this
var dest = LogDestination()
print("My test message", to: &dest)

答案 1 :(得分:1)

可以将所有打印/调试打印日志写入iOS中的文件。在下面用于将调试日志写入文件。

注意:如果您使用以下代码,则日志不会在控制台上打印。

func writeIntoFile() {
    if let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first {
        let filePath = documentDirectoryPath + "/logfile.txt"
        freopen(filePath.cString(using: .ascii), "a", stderr)
    }
}

答案 2 :(得分:1)

我认为您希望将日志记录到外部文件中。 如果是这样,那么您可以尝试以下操作:

func redirectLogs(flag:Bool)  {
    if flag {
        if let documentsPathString = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first {
            let logPath = documentsPathString.appending("app.log")
            freopen(logPath.cString(using: String.Encoding.ascii), "a+",stderr)
        }
    }
}