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.
82 lines
2.0 KiB
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)
|
|
}
|
|
|
|
}
|
|
|