import Foundation final class Log: @unchecked Sendable { enum Level: String, Codable { case debug case info case warning case error var level: Int { switch self { case .debug: return 0 case .info: return 1 case .warning: return 2 case .error: return 3 } } } private var logLevel: Level = .warning private let formatter: DateFormatter = { let formatter = DateFormatter() formatter.dateStyle = .short formatter.timeStyle = .short return formatter }() init(logLevel: Level) { self.logLevel = logLevel } private func log(_ level: Level, message: String) { guard level.rawValue >= logLevel.rawValue else { return } print("[\(formatter.string(from: Date()))][\(level.rawValue.uppercased())] \(message)") } func debug(_ message: String) { log(.debug, message: message) } func info(_ message: String) { log(.info, message: message) } func warning(_ message: String) { log(.warning, message: message) } func error(_ message: String) { log(.error, message: message) } static func debug(_ message: String) { log.debug(message) } static func info(_ message: String) { log.info(message) } static func warning(_ message: String) { log.warning(message) } static func error(_ message: String) { log.error(message) } static let log = Log(logLevel: .warning) }