Sources/Confidence/DebugLogger.swift (84 lines of code) (raw):

import Foundation import OSLog internal protocol DebugLogger { func logEvent(action: String, event: ConfidenceEvent?) func logMessage(message: String, isWarning: Bool) func logFlags(action: String, flag: String) func logFlags(action: String, context: ConfidenceStruct) func logContext(action: String, context: ConfidenceStruct) func logResolveDebugURL(flagName: String, context: ConfidenceStruct) } private extension Logger { private static var subsystem = Bundle.main.bundleIdentifier static let confidence = Logger(subsystem: subsystem ?? "", category: "confidence") } internal class DebugLoggerImpl: DebugLogger { private let encoder = JSONEncoder() private let clientKey: String func logResolveDebugURL(flagName: String, context: ConfidenceStruct) { let ctxNetworkValue = TypeMapper.convert(structure: context) if let ctxNetworkData = try? encoder.encode(ctxNetworkValue), let ctxNetworkString = String(data: ctxNetworkData, encoding: .utf8) { var url = URLComponents() url.scheme = "https" url.host = "app.confidence.spotify.com" url.path = "/flags/resolver-test" url.queryItems = [ URLQueryItem(name: "client-key", value: clientKey), URLQueryItem(name: "flag", value: "flags/\(flagName)"), URLQueryItem(name: "context", value: "\(ctxNetworkString)"), ] log(messageLevel: .DEBUG, message: """ See resolves for \(flagName) in Confidence: \(url.url?.absoluteString ?? "N/A") """) } } private let loggerLevel: LoggerLevel init(loggerLevel: LoggerLevel, clientKey: String) { self.loggerLevel = loggerLevel self.clientKey = clientKey } func logMessage(message: String, isWarning: Bool = false) { if isWarning { log(messageLevel: .WARN, message: message) } else { log(messageLevel: .DEBUG, message: message) } } func logEvent(action: String, event: ConfidenceEvent?) { log(messageLevel: .DEBUG, message: "[\(action)] \(event?.name ?? "")") } func logFlags(action: String, flag: String) { log(messageLevel: .TRACE, message: "[\(action)] \(flag)") } func logFlags(action: String, context: ConfidenceStruct) { log(messageLevel: .TRACE, message: "[\(action)] \(context)") } func logContext(action: String, context: ConfidenceStruct) { log(messageLevel: .TRACE, message: "[\(action)] \(context)") } private func log(messageLevel: LoggerLevel, message: String) { if messageLevel >= loggerLevel { switch messageLevel { case .TRACE: Logger.confidence.trace("\(message)") case .DEBUG: Logger.confidence.debug("\(message)") case .WARN: Logger.confidence.warning("\(message)") case .ERROR: Logger.confidence.error("\(message)") case .NONE: // do nothing break } } } } public enum LoggerLevel: Comparable { case TRACE case DEBUG case WARN case ERROR case NONE }