#pragma once #include #include #include #include #include #ifdef __SWITCH__ #include #endif namespace extra2d { /** * @brief 日志级别枚举 */ enum class LogLevel { Trace = spdlog::level::trace, Debug = spdlog::level::debug, Info = spdlog::level::info, Warn = spdlog::level::warn, Error = spdlog::level::err, Fatal = spdlog::level::critical, Off = spdlog::level::off }; /** * @brief 日志系统管理类 * * 提供统一的日志记录接口,支持控制台和文件输出 * 通过 setLevel() 在运行时控制日志级别 */ class Logger { public: /** * @brief 初始化日志系统 */ static void init(); /** * @brief 关闭日志系统 */ static void shutdown(); /** * @brief 设置日志级别 * @param level 日志级别 */ static void setLevel(LogLevel level); /** * @brief 启用/禁用控制台输出 * @param enable 是否启用 */ static void setConsoleOutput(bool enable); /** * @brief 设置文件输出 * @param filename 日志文件路径 */ static void setFileOutput(const std::string &filename); /** * @brief 获取当前日志级别 * @return 当前日志级别 */ static LogLevel getLevel(); /** * @brief 记录日志(格式化版本) * @tparam Args 参数类型 * @param level 日志级别 * @param fmt 格式字符串 * @param args 格式化参数 */ template static void log(LogLevel level, fmt::format_string fmt, Args &&...args) { if (!logger_) { return; } auto spdLevel = static_cast(level); logger_->log(spdLevel, fmt, std::forward(args)...); } /** * @brief 记录日志(字符串版本) * @param level 日志级别 * @param msg 日志消息 */ static void log(LogLevel level, const char *msg); /** * @brief 获取内部 spdlog 日志器 * @return spdlog 日志器实例 */ static std::shared_ptr getLogger() { return logger_; } private: static std::shared_ptr logger_; static bool initialized_; static bool consoleOutput_; static bool fileOutput_; static std::string logFile_; }; } // namespace extra2d // ============================================ // 日志宏定义 - 简化统一版本 // ============================================ /** * @brief 追踪日志 - 最详细的调试信息 */ #define E2D_TRACE(...) \ ::extra2d::Logger::log(::extra2d::LogLevel::Trace, __VA_ARGS__) /** * @brief 调试日志 - 调试信息 */ #define E2D_DEBUG(...) \ ::extra2d::Logger::log(::extra2d::LogLevel::Debug, __VA_ARGS__) /** * @brief 信息日志 - 一般信息 */ #define E2D_INFO(...) \ ::extra2d::Logger::log(::extra2d::LogLevel::Info, __VA_ARGS__) /** * @brief 警告日志 - 警告信息 */ #define E2D_WARN(...) \ ::extra2d::Logger::log(::extra2d::LogLevel::Warn, __VA_ARGS__) /** * @brief 错误日志 - 错误信息 */ #define E2D_ERROR(...) \ ::extra2d::Logger::log(::extra2d::LogLevel::Error, __VA_ARGS__) /** * @brief 致命错误日志 - 严重错误 */ #define E2D_FATAL(...) \ ::extra2d::Logger::log(::extra2d::LogLevel::Fatal, __VA_ARGS__)