50 lines
1.8 KiB
Swift
50 lines
1.8 KiB
Swift
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
|
|
}
|
|
}
|
|
}
|