2017-06-14 2 views
1

Ich mache kleine Schritte in der iOS-Entwicklung und suche nach einer Methode, Logging in iOS zu verwenden.Wie man Anwendungsprotokolle in Datei schreibt und sie bekommt

fand ich diese Dokumentation zu mit schnellen 3 Anmeldung: https://developer.apple.com/documentation/os/logging#1682426

Die Docs sagen, dass die Protokolle auf der Festplatte gespeichert nicht sind. Was ist der typische Weg, um die Protokolle zu erhalten und die Datei zu verarbeiten?

+0

ich denke, Sie möchten die Protokolle als Datei wie ein CrashReporter bekommen, habe ich recht? In diesem Fall gibt es ein paar Pods, die das archivieren können. [PLRashReporter] (https://www.plcrashreporter.org/) verwende ich in einem meiner Projekte. Es druckt die Logdateien in eine Datei und erstellt einen Bericht, der an einen bestimmten Server gesendet wird. –

+0

Ich möchte Parameter und Laufzeitverhalten mit os.log wie in den Dokumenten protokollieren. In naher Zukunft möchte ich diese Protokolle sammeln und sie woanders hinschicken. Aber ich bin auf der Suche nach einem sauberen, schnellen Code-Ansatz und nicht nach einer Lib. – Offset

Antwort

1

setzen diese Datei zu Ihrem Projekt

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

und wenn Sie etwas müssen angemeldet sein, verwenden Sie nur Druckfunktion wie

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

oder

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

in Ihrer Anwendung " Im Ordner "Dokumente" finden Sie die Datei "log.txt", die Sie später untersuchen können.

während meine Testanwendung zweimal ausgeführt wird, sieht der Inhalt wie

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] 

wenn Sie nicht 'Globals' wie definieren Log als Singletone Klasse

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 
} 

und verwenden Sie es wie

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

okey ja. Dies ist ein Ansatz, aber warum kann ich das os.log-Framework nicht verwenden? Ich meine, es enthält einen LogLevel und so weiter. Ich habe eine offene Frage was bedeutet das "&" vor Log.log? – Offset

+1

@Offset OSLog ist nur für iOS 10+, macOS 10.12+, tvOS 10.0+, watchOS 3.0+ und Unknown SDK 8.0+ verfügbar. & arbeitet als Inout, um die Variable zu einem In-Out-Parameter zu machen. Um OSLog zu verwenden importieren Sie OS zu Ihren Dateien – user3441734

+0

okay, nur um klar zu sein. OSLog ist nur zum Debuggen? Ich kann nicht in Datei schreiben oder kann als Datei verwendet werden? Ich denke es ist sehr verwirrend. Noch dazu gibt es einen NSLog, der für alle Versionen verfügbar ist. Also zusammenfassend: Entweder schreibe ich meinen eigenen Logger (wie oben) oder benutze eine dritte Lib? – Offset

1

Swift 3.0 Version

Erstellen Sie eine neue Datei swift "TextLog.swift" in Ihrem Projekt

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

    } 

} 

den Logger unten im AppDelegate.swift initialisieren es in der Anwendung überall Datei

var textLog = TextLog() 

Verwenden Sie wie unten

textLog.write("hello") 
Verwandte Themen