Ios 如何将应用程序日志写入文件并获取它们

Ios 如何将应用程序日志写入文件并获取它们,ios,swift,logging,swift3,Ios,Swift,Logging,Swift3,我在iOS开发中迈出了一小步,正在寻找一种登录iOS的方法 我找到了这些关于使用swift 3登录的文档: 文档说日志没有保存在磁盘上。获取日志和处理文件的典型方式是什么?将此文件放入您的项目中 // // log.swift // logtest // import Foundation struct Log: TextOutputStream { func write(_ string: String) { let fm = FileManager.defa

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

我找到了这些关于使用swift 3登录的文档:


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

将此文件放入您的项目中

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

    }

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

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

在应用程序的“文档”文件夹中,您可以找到“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] 
如果您不喜欢“globals”,请将Log定义为singletone类

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)
Swift 3.0版

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

//
//  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()
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")

我猜你想把日志像撞车工人一样归档,对吗?在这种情况下,有两个pod可以将其存档。是我在我的一个项目中使用的。它将日志文件打印到一个文件中,并生成一个报告,该报告将发送到一个特定的服务器。我想在文档中使用类似os.log的方法记录参数和运行时行为。在不久的将来,我想收集这些日志并将它们发送到其他地方。但我正在寻找一种干净、快速的代码方法,而不是lib。这是一种方法,但是为什么我不能使用os.log框架呢?我的意思是它包含一个LogLevel等等。我有一个悬而未决的问题:Log.Log前面的“&”是什么意思?@Offset-OSLog仅在iOS 10.0+、macOS 10.12+、tvOS 10.0+、watchOS 3.0+、未知SDK 8.0+上可用用作输入输出,使变量成为输入输出参数。要使用OSLog将os导入到您的文件,请澄清一下。OSLog仅用于调试?我不能写入文件或可以用作文件?我认为这很令人困惑。甚至还有一个NSLog,可用于所有版本。总而言之:要么我自己写日志(如上所述),要么使用第三方库?@Offset up to you:-),没有足够的信息(至少我没有)来有效地使用OSLog。有关NSLog/NSLogv的使用,请参见“man 3 asl”。如果您想将输出定向到其他地方,您需要使用自定义日志功能。是否可以简单地使用通过调用
os\u log
创建的日志,并将其压缩并发送电子邮件?目前我只知道sysdiagnose方法…我可以在我们的设备上看到这个日志文件吗?@AnupGupta,你可以在这里找到它~/Library/Containers/You\u APP\u BUNDLE\u ID/Data/Documents/Users/pradeepkumar/Library/Containers/You\u APP\u BUNDLE\ID/Data/Documents/Qandle/I努力找到它,但这帮了我: