import Foundation import os.log public enum LogLevel: String, CaseIterable { case debug = "DEBUG" case info = "INFO" case warning = "WARNING" case error = "ERROR" } public class Logger { private let osLog: OSLog private let category: String public init(category: String) { self.category = category self.osLog = OSLog(subsystem: "com.menuwhisper.app", category: category) } public func debug(_ message: String, file: String = #file, function: String = #function, line: Int = #line) { log(level: .debug, message: message, file: file, function: function, line: line) } public func info(_ message: String, file: String = #file, function: String = #function, line: Int = #line) { log(level: .info, message: message, file: file, function: function, line: line) } public func warning(_ message: String, file: String = #file, function: String = #function, line: Int = #line) { log(level: .warning, message: message, file: file, function: function, line: line) } public func error(_ message: String, file: String = #file, function: String = #function, line: Int = #line) { log(level: .error, message: message, file: file, function: function, line: line) } private func log(level: LogLevel, message: String, file: String, function: String, line: Int) { let fileName = URL(fileURLWithPath: file).lastPathComponent let logMessage = "[\(category)] \(message) (\(fileName):\(function):\(line))" switch level { case .debug: os_log("%{public}@", log: osLog, type: .debug, logMessage) case .info: os_log("%{public}@", log: osLog, type: .info, logMessage) case .warning: os_log("%{public}@", log: osLog, type: .default, logMessage) case .error: os_log("%{public}@", log: osLog, type: .error, logMessage) } } }