import Foundation enum Log { static let fileURL: URL = { let dir = FileManager.default .urls(for: .libraryDirectory, in: .userDomainMask)[0] .appendingPathComponent("Logs/OpenLess", isDirectory: true) try? FileManager.default.createDirectory(at: dir, withIntermediateDirectories: true) let url = dir.appendingPathComponent("OpenLess.log") if !FileManager.default.fileExists(atPath: url.path) { FileManager.default.createFile(atPath: url.path, contents: nil) } return url }() private static let formatter: ISO8601DateFormatter = { let f = ISO8601DateFormatter() f.formatOptions = [.withInternetDateTime, .withFractionalSeconds] return f }() private static let lock = NSLock() static func write(_ message: String) { let line = "[\(formatter.string(from: Date()))] \(message)\n" guard let data = line.data(using: .utf8) else { return } lock.lock() defer { lock.unlock() } if let handle = try? FileHandle(forWritingTo: fileURL) { _ = try? handle.seekToEnd() try? handle.write(contentsOf: data) try? handle.close() } else { try? data.write(to: fileURL, options: []) } FileHandle.standardError.write(data) } }