You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
LeCountdown/LeCountdown/Utils/FileLogger.swift

82 lines
2.0 KiB

//
// FileLogger.swift
// LeCountdown
//
// Created by Laurent Morvillier on 10/04/2023.
//
import Foundation
struct Log: Identifiable, Codable {
var id: String = UUID().uuidString
var date: Date
var file: String
var line: Int
var function: String
var message: String
var content: String {
return "\(file).\(line).\(function): \(message)"
}
}
class FileLogger {
fileprivate let fileName = "logs.json"
static var main: FileLogger = FileLogger()
var logs: [Log]
var timer: Timer? = nil
init() {
self.logs = []
do {
let content = try FileUtils.readDocumentFile(fileName: self.fileName)
if let logs: [Log] = try content.decodeArray() {
self.logs = logs
} else {
Logger.w("Log decoding failed")
}
} catch {
Logger.error(error)
}
}
func addLog(_ log: Log) {
self.logs.append(log)
self._scheduleWrite()
}
fileprivate func _scheduleWrite() {
self.timer?.invalidate()
self.timer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: false, block: { _ in
self._writeLogs()
})
}
fileprivate func _writeLogs() {
DispatchQueue(label: "app.enchant.write", qos: .utility).async {
if let json = self.logs.jsonString {
do {
let _ = try FileUtils.writeToDocumentDirectory(content: json, fileName: self.fileName)
} catch {
Logger.error(error)
}
}
}
}
@objc static public func log(_ message: String, file: String = #file, function: String = #function, line: Int = #line) {
let filestr = NSString(string: file)
let log = Log(date: Date(), file: filestr.lastPathComponent, line: line, function: function, message: message)
FileLogger.main.addLog(log)
}
}