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

问题描述 投票:0回答:4

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

我希望获得我的应用程序所做操作的日志,即使它不是从 Xcode 启动的。

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

谢谢

ios swift xcode debugging printing
4个回答
5
投票

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
的对象,将消息保存到您选择的文件中。如果您的代码库中已经有现有的打印,这非常有用。然后您只需向它们添加附加参数即可。请记住,这些打印将停止记录到标准输出(控制台)。

打印文档

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)

2
投票

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

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

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

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

0
投票

@Tomasz Bąk 提案的更现代版本:

final class LogDestination: TextOutputStream {
static var dest = LogDestination()

private let logURL: URL
init() {
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    logURL = paths.first!.appendingPathComponent("log.txt", conformingTo: .plainText)
}

func write(_ string: String) {
    do {
        if !FileManager.default.fileExists(atPath: logURL.path) {   // does it exits?
            FileManager.default.createFile(atPath: logURL.path, contents: nil)
        }
        if let data = string.data(using: .utf8) {
            let fileHandle = try FileHandle(forWritingTo: logURL)
            try fileHandle.seekToEnd()
            try fileHandle.write(contentsOf: data)
            try fileHandle.close()
        }
    } catch let error as NSError {                              // something wrong
        print("Unable to write log: \(error.debugDescription)") // debug printout
    }
}

}

使用方法:

print("Hello World", to: &LogDestination.dest)
© www.soinside.com 2019 - 2024. All rights reserved.