#pragma once #include #include #include #include enum class LogLevel { debug = 0, info = 1, warning = 2, error = 3 }; class DaliLog { public: static DaliLog& instance() { static DaliLog inst; return inst; } void setLevel(LogLevel level) { std::lock_guard lock(mu_); level_ = level; } LogLevel currentLevel() const { return level_; } void setSink(std::function sink) { std::lock_guard lock(mu_); sink_ = std::move(sink); } void debugLog(const std::string& message) { log(LogLevel::debug, "DEBUG", message); } void infoLog(const std::string& message) { log(LogLevel::info, "INFO", message); } void warningLog(const std::string& message) { log(LogLevel::warning, "WARNING", message); } void errorLog(const std::string& message) { log(LogLevel::error, "ERROR", message); } std::vector logMessages() const { std::lock_guard lock(mu_); return logs_; } void clearLogs() { std::lock_guard lock(mu_); logs_.clear(); } private: DaliLog() = default; void log(LogLevel level, const char* tag, const std::string& message) { std::lock_guard lock(mu_); if (static_cast(level) < static_cast(level_)) return; const std::string line = std::string("[") + tag + "] " + message; logs_.push_back(line); if (sink_) sink_(line); } mutable std::mutex mu_; LogLevel level_ = LogLevel::info; std::vector logs_; std::function sink_; };