#pragma once #include "spdlog/spdlog.h" #include #include class zlog final { public: enum class LogLevel : uint8_t { debug, info, warn, error, fatal }; public: zlog(); ~zlog(); template void log(LogLevel level, TARGS&&... args) { switch (level) { case LogLevel::debug: m_logger->debug(std::forward(args)...); break; case LogLevel::info: m_logger->info(std::forward(args)...); break; case LogLevel::warn: m_logger->warn(std::forward(args)...); break; case LogLevel::error: m_logger->error(std::forward(args)...); break; case LogLevel::fatal: m_logger->critical(std::forward(args)...); fatalCallback(std::forward(args)...); break; default: break; } } template void fatalCallback(TARGS&&... args) { const std::string format_str = fmt::format(std::forward(args)...); throw std::runtime_error(format_str); } private: std::shared_ptr m_logger; }; extern zlog gLog; #define LOG_HELPER(LOG_LEVEL, ...) \ gLog.log(LOG_LEVEL, "[" + std::string(__FUNCTION__) + "] " + __VA_ARGS__); #define LOG_DEBUG(...) LOG_HELPER(zlog::LogLevel::debug, __VA_ARGS__); #define LOG_INFO(...) LOG_HELPER(zlog::LogLevel::info, __VA_ARGS__); #define LOG_WARN(...) LOG_HELPER(zlog::LogLevel::warn, __VA_ARGS__); #define LOG_ERROR(...) LOG_HELPER(zlog::LogLevel::error, __VA_ARGS__); #define LOG_FATAL(...) LOG_HELPER(zlog::LogLevel::fatal, __VA_ARGS__);