Files
amnezia-client/client/platforms/ios/LogRecord.swift
T

104 lines
2.4 KiB
Swift
Raw Normal View History

2024-02-10 19:44:55 +03:00
import Foundation
import os.log
extension Log {
struct Record {
let date: Date
let level: Level
let message: String
2024-02-11 01:55:54 +03:00
2024-02-10 19:44:55 +03:00
init?(_ str: String) {
let dateStr = String(str.prefix(19))
guard let date = Log.dateFormatter.date(from: dateStr) else { return nil }
2024-02-11 01:55:54 +03:00
2024-02-10 19:44:55 +03:00
let str = str.dropFirst(20)
2024-02-11 01:55:54 +03:00
2024-02-10 19:44:55 +03:00
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 }
2024-02-11 01:55:54 +03:00
2024-02-10 19:44:55 +03:00
let messageStartIndex = str.index(after: endIndex)
let message = String(str[messageStartIndex..<str.endIndex])
2024-02-11 01:55:54 +03:00
2024-02-10 19:44:55 +03:00
self.init(date: date, level: level, message: message)
}
2024-02-11 01:55:54 +03:00
2024-02-10 19:44:55 +03:00
init(date: Date, level: Level, message: String) {
self.date = date
self.level = level
self.message = message
}
2024-02-11 01:55:54 +03:00
2024-02-10 19:44:55 +03:00
func save(at url: URL) {
osLog.log(level: level.osLogType, "\(message)")
2024-02-10 19:44:55 +03:00
guard let data = "\n\(description)".data(using: .utf8) else { return }
2024-02-11 01:55:54 +03:00
2024-02-10 19:44:55 +03:00
if !FileManager.default.fileExists(atPath: url.path) {
2024-02-11 01:55:54 +03:00
guard (try? "".data(using: .utf8)?.write(to: url)) != nil else { return }
2024-02-10 19:44:55 +03:00
}
2024-02-11 01:55:54 +03:00
2024-02-10 19:44:55 +03:00
guard let fileHandle = try? FileHandle(forUpdating: url) else { return }
2024-02-11 01:55:54 +03:00
2024-02-10 19:44:55 +03:00
defer { fileHandle.closeFile() }
2024-02-11 01:55:54 +03:00
guard (try? fileHandle.seekToEnd()) != nil else { return }
2024-02-10 19:44:55 +03:00
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
2024-02-11 01:55:54 +03:00
2024-02-10 19:44:55 +03:00
init(from osLogType: OSLogType) {
switch osLogType {
case .default:
2024-02-10 19:44:55 +03:00
self = .info
case .info:
2024-02-10 19:44:55 +03:00
self = .info
case .debug:
2024-02-10 19:44:55 +03:00
self = .debug
case .error:
2024-02-10 19:44:55 +03:00
self = .error
case .fault:
2024-02-10 19:44:55 +03:00
self = .fatal
default:
self = .info
}
}
var osLogType: OSLogType {
switch self {
case .info:
return .info
case .debug:
return .debug
case .error:
return .error
case .fatal:
return .fault
case .warning:
return .info
case .critical:
return .fault
case .system:
return .fault
}
}
2024-02-10 19:44:55 +03:00
}
}