【问题标题】:iOS Swift: write print and debug prints into a fileiOS Swift:将打印和调试打印写入文件
【发布时间】:2018-11-20 12:05:56
【问题描述】:

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

我想记录我的应用程序在没有从 Xcode 启动的情况下所做的事情。

我正在考虑重写 print 和 debugPrint 方法并将输入写入文件。

谢谢

【问题讨论】:

标签: ios swift xcode debugging printing


【解决方案1】:

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)

【讨论】:

  • 目前还不清楚如何使用它。请给我一个简短的例子吗?
  • 我已经添加了示例
  • @mattt 最近写了一篇关于这个话题的文章。好书nshipster.com/textoutputstream
  • 我猜,这在 xcode 12.4 中不起作用。我喜欢苹果的技术。但是,如果他们能停止对 swift 进行更改,我将非常感激。苹果???你好???
【解决方案2】:

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

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

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

【讨论】:

  • 我使用"a+", stdout而不是`"a", stderr`来查看txt文件中的所有日志。
【解决方案3】:

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

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)
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多