11

我正在 iOS 开发中迈出小步,并寻找一种在 iOS 中使用登录的方法。

我找到了这些关于使用 swift 3 进行日志记录的文档:https ://developer.apple.com/documentation/os/logging#1682426

文档说日志没有保存在磁盘上。获取日志和处理文件的典型方法是什么?

4

3 回答 3

22

把这个文件放到你的项目中

//
//  log.swift
//  logtest
//

import Foundation

struct Log: TextOutputStream {

    func write(_ string: String) {
        let fm = FileManager.default
        let log = fm.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("log.txt")
        if let handle = try? FileHandle(forWritingTo: log) {
            handle.seekToEndOfFile()
            handle.write(string.data(using: .utf8)!)
            handle.closeFile()
        } else {
            try? string.data(using: .utf8)?.write(to: log)
        }
    }
}

var logger = Log()

如果您需要记录某些内容,只需使用打印功能

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        print("started:", Date(), to: &logger)
        return true
    }

或者

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    print(#file, #function, "my own text", 1, [1,2], to: &logger)
}

在您的应用程序的“文档”文件夹中,您可以找到“log.txt”文件,您可以稍后检查该文件。

在运行我的测试应用程序两次时,内容看起来像

started: 2017-06-14 09:58:58 +0000
/Users/ivo_vacek/Documents/logtest/logtest/ViewController.swift viewDidLoad() my own text 1 [1, 2]
started: 2017-06-14 09:59:15 +0000
/Users/ivo_vacek/Documents/logtest/logtest/ViewController.swift viewDidLoad() my own text 1 [1, 2] 

如果您不喜欢“全局”,请将 Log 定义为单音类

class Log: TextOutputStream {

    func write(_ string: String) {
        let fm = FileManager.default
        let log = fm.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("log.txt")
        if let handle = try? FileHandle(forWritingTo: log) {
            handle.seekToEndOfFile()
            handle.write(string.data(using: .utf8)!)
            handle.closeFile()
        } else {
            try? string.data(using: .utf8)?.write(to: log)
        }
    }
    static var log: Log = Log()
    private init() {} // we are sure, nobody else could create it
}

并像使用它一样

print("started:", Date(), to: &Log.log)
于 2017-06-14T10:02:13.060 回答
10

斯威夫特 3.0 版本

在您的项目中创建一个新的 swift 文件“TextLog.swift”

import Foundation

struct TextLog: TextOutputStream {

    /// Appends the given string to the stream.
    mutating func write(_ string: String) {
        let paths = FileManager.default.urls(for: .documentDirectory, in: .allDomainsMask)
        let documentDirectoryPath = paths.first!
        let log = documentDirectoryPath.appendingPathComponent("log.txt")

        do {
            let handle = try FileHandle(forWritingTo: log)
            handle.seekToEndOfFile()
            handle.write(string.data(using: .utf8)!)
            handle.closeFile()
        } catch {
            print(error.localizedDescription)
            do {
                try string.data(using: .utf8)?.write(to: log)
            } catch {
                print(error.localizedDescription)
            }
        }

    }

}

在 AppDelegate.swift 文件的底部初始化记录器

var textLog = TextLog()

在应用程序的任何地方使用它,如下所示

textLog.write("hello")
于 2017-09-21T09:01:12.727 回答
1

文档说日志没有保存在磁盘上。获取日志和处理文件的典型方法是什么?

我不确定这在某些时候是否属实并已更改,但是您链接到的当前文档 确实说日志保存在磁盘上:

该系统将日志数据集中存储在内存和磁盘上,而不是将该数据写入基于文本的日志文件。

具体来说,您可以在推荐文章中找到此表:

在此处输入图像描述

您可以使用工具或自定义配置文件覆盖每个日志级别的默认存储行为。有关如何执行此操作的更多信息,请参阅调试时自定义日志记录行为

这是文章中有关如何使用记录器(swift)的示例:

if #available(OSX 11.0, *) {
   // Log a message to the default log and default log level.
   let defaultLog = Logger()
   defaultLog.log("This is a default message.")
            
   // Log a message to the default log and debug log level
   defaultLog.debug("This is a debug message.")


   // Log an error to a custom log object.
   let customLog = Logger(subsystem: "com.your_company.your_subsystem", 
          category: "your_category_name")
   customLog.error("An error occurred!")
} else {
   // Log a message to the default log and default log level.
   os_log("This is a default message.")
            
   // Log a message to the default log and debug log level
   os_log("This is a debug message.", log: OSLog.default, type: .debug)
            
   // Log an error to a custom log object.
   let customLog = OSLog(subsystem: "com.your_company.your_subsystem", 
            category: "your_category_name")
   os_log("An error occurred!", log: customLog, type: .error)
}

据我所知,没有必要使用其他答案(不再?)

于 2021-12-22T18:31:45.320 回答