parent
f2d13148a3
commit
158c11a0ec
12 changed files with 252 additions and 93 deletions
82
client/platforms/ios/LogRecord.swift
Normal file
82
client/platforms/ios/LogRecord.swift
Normal file
|
@ -0,0 +1,82 @@
|
|||
import Foundation
|
||||
import os.log
|
||||
|
||||
extension Log {
|
||||
struct Record {
|
||||
let date: Date
|
||||
let level: Level
|
||||
let message: String
|
||||
|
||||
init?(_ str: String) {
|
||||
let dateStr = String(str.prefix(19))
|
||||
guard let date = Log.dateFormatter.date(from: dateStr) else { return nil }
|
||||
|
||||
let str = str.dropFirst(20)
|
||||
|
||||
guard let endIndex = str.firstIndex(of: " ") else { return nil }
|
||||
let levelStr = String(str[str.startIndex..<endIndex])
|
||||
guard let level = Level(rawValue: levelStr) else { return nil }
|
||||
|
||||
let messageStartIndex = str.index(after: endIndex)
|
||||
let message = String(str[messageStartIndex..<str.endIndex])
|
||||
|
||||
self.init(date: date, level: level, message: message)
|
||||
}
|
||||
|
||||
init(date: Date, level: Level, message: String) {
|
||||
self.date = date
|
||||
self.level = level
|
||||
self.message = message
|
||||
}
|
||||
|
||||
func save(at url: URL) {
|
||||
guard let data = "\n\(description)".data(using: .utf8) else { return }
|
||||
|
||||
if !FileManager.default.fileExists(atPath: url.path) {
|
||||
guard let _ = try? "".data(using: .utf8)?.write(to: url) else { return }
|
||||
}
|
||||
|
||||
guard let fileHandle = try? FileHandle(forUpdating: url) else { return }
|
||||
|
||||
defer { fileHandle.closeFile() }
|
||||
|
||||
guard let _ = try? fileHandle.seekToEnd() else { return }
|
||||
try? fileHandle.write(contentsOf: data)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension Log.Record: CustomStringConvertible {
|
||||
var description: String {
|
||||
"\(Log.dateFormatter.string(from: date)) \(level.rawValue) \(message)"
|
||||
}
|
||||
}
|
||||
|
||||
extension Log.Record {
|
||||
enum Level: String {
|
||||
case debug
|
||||
case warning
|
||||
case error
|
||||
case critical
|
||||
case fatal
|
||||
case info
|
||||
case system // critical
|
||||
|
||||
init(from osLogType: OSLogType) {
|
||||
switch osLogType {
|
||||
case OSLogType.default:
|
||||
self = .info
|
||||
case OSLogType.info:
|
||||
self = .info
|
||||
case OSLogType.debug:
|
||||
self = .debug
|
||||
case OSLogType.error:
|
||||
self = .error
|
||||
case OSLogType.fault:
|
||||
self = .fatal
|
||||
default:
|
||||
self = .info
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue