/** * @file mcp_logger.h * @brief 简单的日志记录机制 */ #ifndef MCP_LOGGER_H #define MCP_LOGGER_H #include #include #include #include #include #include namespace mcp { enum class log_level { debug, info, warning, error }; class logger { public: static logger& instance() { static logger instance; return instance; } void set_level(log_level level) { std::lock_guard lock(mutex_); level_ = level; } template void debug(Args&&... args) { log(log_level::debug, std::forward(args)...); } template void info(Args&&... args) { log(log_level::info, std::forward(args)...); } template void warning(Args&&... args) { log(log_level::warning, std::forward(args)...); } template void error(Args&&... args) { log(log_level::error, std::forward(args)...); } private: logger() : level_(log_level::info) {} template void log_impl(std::stringstream& ss, T&& arg) { ss << std::forward(arg); } template void log_impl(std::stringstream& ss, T&& arg, Args&&... args) { ss << std::forward(arg); log_impl(ss, std::forward(args)...); } template void log(log_level level, Args&&... args) { if (level < level_) { return; } std::stringstream ss; // 添加时间戳 auto now = std::chrono::system_clock::now(); auto now_c = std::chrono::system_clock::to_time_t(now); auto now_tm = std::localtime(&now_c); ss << std::put_time(now_tm, "%Y-%m-%d %H:%M:%S") << " "; // 添加日志级别 switch (level) { case log_level::debug: ss << "[DEBUG] "; break; case log_level::info: ss << "[INFO] "; break; case log_level::warning: ss << "[WARNING] "; break; case log_level::error: ss << "[ERROR] "; break; } // 添加日志内容 log_impl(ss, std::forward(args)...); // 输出日志 std::lock_guard lock(mutex_); std::cerr << ss.str() << std::endl; } log_level level_; std::mutex mutex_; }; #define LOG_DEBUG(...) mcp::logger::instance().debug(__VA_ARGS__) #define LOG_INFO(...) mcp::logger::instance().info(__VA_ARGS__) #define LOG_WARNING(...) mcp::logger::instance().warning(__VA_ARGS__) #define LOG_ERROR(...) mcp::logger::instance().error(__VA_ARGS__) } // namespace mcp #endif // MCP_LOGGER_H