// // SDLLogger.swift // Tun // // Created by 安礼成 on 2024/3/13. // import Foundation import os public final class SDLLogger: @unchecked Sendable { public enum Category: String, CaseIterable { case app case context case dns case network case packet case policy case session case `super` case udpHole } private static let subsystem = "com.jihe.punchnet.tun" private static let loggers: [Category: SDLLogger] = { Dictionary(uniqueKeysWithValues: Category.allCases.map { ($0, SDLLogger(category: $0)) }) }() private let logger: Logger private init(category: Category) { self.logger = Logger(subsystem: Self.subsystem, category: category.rawValue) } private func log(_ message: String) { self.logger.info("\(message, privacy: .public)") } private func trace(_ message: String) { self.logger.debug("\(message, privacy: .public)") } private func fatal(_ message: String) { self.logger.fault("\(message, privacy: .public)") } public static func log(_ message: @autoclosure () -> String, category: Category = .context) { guard let logger = loggers[category] else { return } logger.log(message()) } public static func trace(_ message: @autoclosure () -> String, category: Category) { guard let logger = loggers[category] else { return } logger.trace(message()) } public static func fatal(_ message: @autoclosure () -> String, category: Category = .context) { guard let logger = loggers[category] else { return } logger.fatal(message()) } }