// Minimal structured logger (key=value pairs, levels, secret redaction). No external dependency. #pragma once #include #include #include #include #include #include namespace raid::log { enum class Level : int { trace = 0, debug = 1, info = 2, warn = 3, error = 4, off = 5 }; using Fields = std::vector>; using Sink = std::function; void set_level(Level l); Level level(); void set_sink(Sink s); // default: stderr, one line per event, "level msg k=v k=v" void emit(Level l, std::string_view msg, Fields fields = {}); /// Replaces bearer tokens / api keys ("fd_xxx.yyy", "Bearer …") by "". std::string redact(std::string_view s); inline void info(std::string_view m, Fields f = {}) { emit(Level::info, m, std::move(f)); } inline void warn(std::string_view m, Fields f = {}) { emit(Level::warn, m, std::move(f)); } inline void error(std::string_view m, Fields f = {}) { emit(Level::error, m, std::move(f)); } inline void debug(std::string_view m, Fields f = {}) { emit(Level::debug, m, std::move(f)); } } // namespace raid::log