web-dev-qa-db-ja.com

アプリケーションログをファイルに書き込んで取得する方法

私はiOSの開発で重要な一歩を踏み出し、iOSでロギングを使用する方法を探しています。

Swift 3: https://developer.Apple.com/documentation/os/logging#1682426 を使用したロギングに関するこれらのドキュメントを見つけました

ドキュメントには、ログがディスクに保存されていないと記載されています。ログを取得してファイルを処理する一般的な方法は何ですか?

9
Offset

このファイルをプロジェクトに配置します

//
//  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」ファイルがあり、後で確認できます。

テストアプリケーションを2回実行すると、コンテンツは次のようになります。

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をシングルトーンクラスとして定義します

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)
12
user3441734

Swift 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")
4
Rajat Jain