import Foundation /// 轻量日志:写到 ~/Library/Logs/TinySTT.log,方便排查(也便于无 UI 时验证)。 enum Log { private static let queue = DispatchQueue(label: "tinystt.log") private static let url: URL = { let dir = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask)[0] .appendingPathComponent("Logs", isDirectory: true) try? FileManager.default.createDirectory(at: dir, withIntermediateDirectories: true) return dir.appendingPathComponent("TinySTT.log") }() private static let formatter: DateFormatter = { let f = DateFormatter() f.dateFormat = "MM-dd HH:mm:ss.SSS" return f }() static func info(_ message: String) { write("INFO", message) } static func error(_ message: String) { write("ERR ", message) } private static func write(_ level: String, _ message: String) { queue.async { let line = "[\(formatter.string(from: Date()))] \(level) \(message)\n" if let attrs = try? FileManager.default.attributesOfItem(atPath: url.path), let size = attrs[.size] as? Int, size > 1_000_000 { let previous = url.appendingPathExtension("1") try? FileManager.default.removeItem(at: previous) try? FileManager.default.moveItem(at: url, to: previous) } guard let data = line.data(using: .utf8) else { return } if let handle = try? FileHandle(forWritingTo: url) { handle.seekToEndOfFile() handle.write(data) try? handle.close() } else { try? data.write(to: url) } #if DEBUG FileHandle.standardError.write(line.data(using: .utf8) ?? Data()) #endif } } }