2017-06-14 5 views
1

私はiOSの開発とiOSのログイン方法を探しています。アプリケーションログをファイルに書き込んで取得する方法

私は迅速3でのログインに関するこれらのドキュメントを見つけました:https://developer.apple.com/documentation/os/logging#1682426

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

+0

あなたはCrashReporterのようなファイルとしてログを取得したいと思いますか?その場合、これをアーカイブすることができる2つのポッドがあります。 [PLCrashReporter](https://www.plcrashreporter.org/)は私のプロジェクトの1つです。ログファイルをファイルに出力し、特定のサーバーに送信されるレポートを作成します。 –

+0

ドキュメントのように、os.logを使用してパラメータと実行時の動作を記録します。近い将来、これらのログを収集して他の場所に送信したいと考えています。しかし、私はコードアプローチではなく、libでクリーン迅速に探しています。 – Offset

答えて

1

プロジェクトにこのファイルを置く

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

のような印刷機能を使用します " Documentsフォルダには、後で調べることができる 'log.txt'ファイルがあります。

二回私のテストアプリケーションを実行中に「グローバル」は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 
} 

としてログインを定義し、

のようにそれを使用して好きではない場合、コンテンツが

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] 

のように見えます

print("started:", Date(), to: &Log.log) 
+0

ああええ。これはアプローチですが、なぜ私はos.logフレームワークを使用できませんか?私はそれがLogLevelを含むことを意味します。私はLog.logの前に '&'を意味する質問を開いていますか? – Offset

+1

@Offset OSLogは、iOS 10.0以降、MacOS 10.12+、tvOS 10.0+、watchOS 3.0+、Unknown SDK 8.0+でのみ利用可能です。 &inoutとして動作し、変数をin-outパラメータにします。あなたのファイルにOSLog import osを使用するには – user3441734

+0

大丈夫です。 OSLogはデバッグ専用ですか?ファイルに書き込むことはできませんか、ファイルとして使用できますか?私は非常に混乱していると思う。さらに、すべてのバージョンで利用可能なNSLogがあります。まとめてみましょう:私は自分のロガーを書くか(上記のように)、またはサードパーティ製のlibを使いますか? – Offset

1

スイフト3.0バージョン

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

    } 

} 

var textLog = TextLog() 

以下のようなアプリケーションの任意の場所に使用するファイルAppDelegate.swiftで下部にあるロガーを初期化し、プロジェクトに新しいSWIFTファイル「TextLog.swift」を作成します。
textLog.write("hello") 
関連する問題